PHP对象、模式与实践之高级特性分析


Posted in PHP onDecember 08, 2016

本文实例讲述了PHP面向对象程序设计高级特性。分享给大家供大家参考,具体如下:

高级特性

包括:

1.静态方法和属性(通过类而不是对象来访问数据和功能)
2.抽象类和接口(设计,实现分离)
3.错误处理(异常)
4.Final类和方法(限制继承)
5.拦截器(自动委托)
6.析构方法(对象销毁前的清理工作)
7.克隆对象(创建对象的副本)
8.把对象解析成字符串

PS,学会从内存的角度看代码。想象计算机的微观世界。

静态方法的小例子

<?php
class StaticExample{
  static public $aNum = 10;
  static public function sayHello(){
    print "hello";
  }
}
print StaticExample::$aNum."<br/>";
StaticExample::sayHello();

tips:

1.静态方法不能访问类中的普通属性,因为那些属性属于一个对象,但可以访问静态属性。
2.我们不能再对象中调用静态方法,因此不能再静态方法中使用伪变量$this。

静态方法的大例子

<?php
class ShopProduct{
  private $title;
  private $producerMainName;
  private $producerFirstName;
  protected $price;
  private $discount = 0;
  private $id = 0;
  function __construct($title,$firstName,$mainName,$price){
    $this->title = $title;
    $this->producerFirstName = $firstName;
    $this->producerMainName = $mainName;
    $this->price = $price;
  }
  public function setID($id){
    $this->id = $id;
  }
  public static function getInstance($id,PDO $pdo){
    $query = "select * from products where id= '$id'";
    $stmt = $pdo->query($query);
    $row = $stmt->fetch();
    if(empty($row)){
      return null;
    }
    if($row['type'] == "book"){
      $product = new BookProduct($row['title'],
        $row['firstname'],
        $row['mainname'],
        $row['price'],
        $row['numpages']
        );
    }else if($row['type'] == "cd"){
      $product = new CdProduct($row['title'],
        $row['firstname'],
        $row['mainname'],
        $row['price'],
        $row['playLength']
        );
    }else{
      $product = new ShopProduct($row['title'],
        $row['firstname'],
        $row['mainname'],
        $row['price']
        );
    }
    $product->setId($row['id']);
    $product->setDiscount($row['discount']);
    return $product;
  }
  public function getProducerFirstName(){
    return $this->producerFirstName;
  }
  public function getProducerMainName(){
    return $this->producerMainName;
  }
  public function setDiscount($num){
    $this->discount = $num;
  }
  public function getDiscount(){
    return $this->discount;
  }
  public function getTitle(){
    return $this->title;
  }
  public function getPrice(){
    return ($this->price - $this->discount);
  }
  function getProducer(){
    return $this->producerFirstName." ".$this->producerMainName;
  }
  function getSummaryLine(){
    $base = "$this->title({$this->producerMainName},";
    $base .= "{$this->producerFirstName})";
    return $base;
  }
}
class CdProduct extends ShopProduct{
  private $playLength;
  function __construct($title,$firstName,$mainName,$price,$playLength){
    parent::__construct($title,$firstName,$mainName,$price);//继承父类的构造函数
    $this->playLength = $playLength;
  }
  function getPlayLength(){
    return $this->playLength;
  }
  function getSummaryLine(){
    $base = parent::getSummaryLine();
    $base .= ":playing time {$this->playLength}";
    return $base;
  }
}
class BookProduct extends ShopProduct{
  private $numPages = 0;
  function __construct($title,$firstName,$mainName,$price,$numPages){
    parent::__construct($title,$firstName,$mainName,$price);
    $this->numPages = $numPages;
  }
  function getnumPages(){
    return $this->numPages;
  }
  function getSummaryLine(){
    $base = parent::getSummaryLine();
    $base .= ":page count {$this->numPages}";
    return $base;
  }
}
$dsn = "sqlite:C:/Users/Administrator/Desktop/shop.db";
$pdo = new PDO($dsn,null,null);
$pdo->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$obj = ShopProduct::getInstance(1,$pdo);
echo $obj->getSummaryLine();

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
消息持续发送的完整例子
Oct 09 PHP
一个简单的PHP&amp;MYSQL留言板源码
Jul 19 PHP
PHP下通过file_get_contents的代理使用方法
Feb 16 PHP
PDO版本问题 Invalid parameter number: no parameters were bound
Jan 06 PHP
一个漂亮的php验证码类(分享)
Aug 06 PHP
PHP的Laravel框架结合MySQL与Redis数据库的使用部署
Mar 21 PHP
PHP实现在数据库百万条数据中随机获取20条记录的方法
Apr 19 PHP
php支付宝APP支付功能
Jul 29 PHP
PHP自动生成缩略图函数的源码示例
Mar 18 PHP
php文件操作之文件写入字符串、数组的方法分析
Apr 15 PHP
php利用ZipArchive类操作文件的实例
Jan 21 PHP
Yii实现微信公众号场景二维码的方法实例
Aug 30 PHP
php中__toString()方法用法示例
Dec 07 #PHP
php中this关键字用法分析
Dec 07 #PHP
php中final关键字用法分析
Dec 07 #PHP
php中static和const关键字用法分析
Dec 07 #PHP
php抽象方法和抽象类实例分析
Dec 07 #PHP
php接口技术实例详解
Dec 07 #PHP
php常用数组array函数实例总结【赋值,拆分,合并,计算,添加,删除,查询,判断,排序】
Dec 07 #PHP
You might like
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
Discuz板块横排显示图片的实现方法
2007/05/28 PHP
PHP使用strtotime获取上个月、下个月、本月的日期
2015/12/30 PHP
php出租房数据管理及搜索页面
2017/05/23 PHP
PHP发送邮件确认验证注册功能示例【修改别人邮件类】
2019/11/09 PHP
js 无提示关闭浏览器页面的代码
2010/03/09 Javascript
web基于浏览器的本地存储方法应用
2012/11/27 Javascript
js中的eventType事件及其浏览器支持性介绍
2013/11/29 Javascript
JavaScript 异常处理 详解
2015/02/06 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
JavaScript将DOM事件处理程序封装为event.js 出现的低级错误问题
2016/08/03 Javascript
Node.js v8.0.0正式发布!看看带来了哪些主要新特性
2017/06/02 Javascript
详解js几个绕不开的事件兼容写法
2017/08/30 Javascript
Vue项目全局配置微信分享思路详解
2018/05/04 Javascript
ant design实现圈选功能
2019/12/17 Javascript
Preload基础使用方法详解
2020/02/03 Javascript
Vue自定义表单内容检查rules实例
2020/10/30 Javascript
[05:10]2014DOTA2国际邀请赛 通往胜利之匙赛场探秘之旅
2014/07/18 DOTA
用Python给文本创立向量空间模型的教程
2015/04/23 Python
Python实现Mysql数据库连接池实例详解
2017/04/11 Python
详解将Django部署到Centos7全攻略
2018/09/26 Python
Python画图高斯分布的示例
2019/07/10 Python
Flask框架中request、请求钩子、上下文用法分析
2019/07/23 Python
详解python破解zip文件密码的方法
2020/01/13 Python
借助Paramiko通过Python实现linux远程登陆及sftp的操作
2020/03/16 Python
Python3自动生成MySQL数据字典的markdown文本的实现
2020/05/07 Python
python中常见错误及解决方法
2020/06/21 Python
html5使用canvas实现弹幕功能示例
2017/09/11 HTML / CSS
使用layui实现左侧菜单栏及动态操作tab项的方法
2020/11/10 HTML / CSS
加拿大时尚潮流大码女装购物网站:Addition Elle
2018/04/02 全球购物
学生安全责任书模板
2014/07/25 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
发票退票证明
2015/06/24 职场文书
行政处罚告知书
2015/07/01 职场文书
2016先进工作者事迹材料
2016/02/25 职场文书
解决IIS7下无法绑定https主机的问题
2022/04/29 Servers