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 相关文章推荐
用PHP和ACCESS写聊天室(三)
Oct 09 PHP
php网站地图生成类示例
Jan 13 PHP
discuz加密解密函数使用方法和中文注释
Jan 21 PHP
支持中文和其他编码的php截取字符串函数分享(截取中文字符串)
Mar 13 PHP
php中把美国时间转为北京时间的自定义函数分享
Jul 28 PHP
php通过文件流方式复制文件的方法
Mar 13 PHP
PHP实现的统计数据功能详解
Dec 06 PHP
PHP+Ajax无刷新带进度条图片上传示例
Feb 08 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
Jun 12 PHP
PHP使用redis消息队列发布微博的方法示例
Jun 22 PHP
Yii框架实现对数据库的CURD操作示例
Sep 03 PHP
php5.3/5.4/5.5/5.6/7常见新增特性汇总整理
Feb 27 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
php smarty模版引擎中的缓存应用
2009/12/02 PHP
PHP实现事件机制的方法
2015/07/10 PHP
详解php与ethereum客户端交互
2018/04/28 PHP
php抽象方法和普通方法的区别点总结
2019/10/13 PHP
Laravel 微信小程序后端实现用户登录的示例代码
2019/11/26 PHP
Node.js实战 建立简单的Web服务器
2012/03/08 Javascript
jquery动态添加删除div 具体实现
2013/07/20 Javascript
js使用eval解析json实例与注意事项分享
2014/01/18 Javascript
使用three.js 画渐变的直线
2016/06/05 Javascript
BackBone及其实例探究_动力节点Java学院整理
2017/07/14 Javascript
对于input 框限定输入值为浮点型的js代码
2017/09/25 Javascript
在vue组件中使用axios的方法
2018/03/16 Javascript
原生JS实现$.param() 函数的方法
2018/08/10 Javascript
vue 实现在函数中触发路由跳转的示例
2018/09/01 Javascript
详解babel升级到7.X采坑总结
2019/05/12 Javascript
微信小程序使用字体图标的方法
2019/05/23 Javascript
小程序实现图片移动缩放效果
2020/05/26 Javascript
[42:35]2018DOTA2亚洲邀请赛3月30日 小组赛A组 VG VS OpTic
2018/03/31 DOTA
python之import机制详解
2014/07/03 Python
用python + openpyxl处理excel2007文档思路以及心得
2014/07/14 Python
python判断windows系统是32位还是64位的方法
2015/05/11 Python
在Django的视图(View)外使用Session的方法
2015/07/23 Python
详解Python中open()函数指定文件打开方式的用法
2016/06/04 Python
利用Python操作消息队列RabbitMQ的方法教程
2017/07/19 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
基于python使用tibco ems代码实例
2019/12/20 Python
python通过nmap扫描在线设备并尝试AAA登录(实例代码)
2019/12/30 Python
pycharm实现猜数游戏
2020/12/07 Python
幼儿园五一活动方案
2014/02/07 职场文书
作风建设年度心得体会
2014/10/29 职场文书
公司食堂管理制度
2015/08/05 职场文书
小学语文教学随笔
2015/08/14 职场文书
2015年中学体育教师工作总结
2015/10/23 职场文书
2020优秀员工演讲稿(三篇)
2019/10/17 职场文书
springboot+VUE实现登录注册
2021/05/27 Vue.js
详解缓存穿透击穿雪崩解决方案
2021/05/28 Redis