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实现小型站点广告管理(修正版)
Oct 09 PHP
从一个不错的留言本弄的mysql数据库操作类
Sep 02 PHP
php 动态添加记录
Mar 10 PHP
php设计模式 Composite (组合模式)
Jun 26 PHP
求PHP数组最大值,最小值的代码
Oct 31 PHP
PHP实现提取一个图像文件并在浏览器上显示的代码
Oct 06 PHP
PHP中实现生成静态文件的方法缓解服务器压力
Jan 07 PHP
简单说说PHP优化那些事(经验分享)
Nov 27 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
PHP实现搜索时记住状态的方法示例
May 11 PHP
ThinkPHP3.2.3框架实现的空模块、空控制器、空操作,跳转到错误404页面图文详解
Apr 03 PHP
laravel实现上传图片的两种方式小结
Oct 12 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绘制圆形的方法
2015/01/24 PHP
PHP用户注册邮件激活账户的实现代码
2017/05/31 PHP
javascript 表单的友好用户体现
2009/01/07 Javascript
Firefox div高度自适应
2009/04/28 Javascript
Mootools 1.2教程 Fx.Tween的使用
2009/09/15 Javascript
从数据结构的角度分析 for each in 比 for in 快的多
2013/07/07 Javascript
jquery.qrcode在线生成二维码使用示例
2013/08/21 Javascript
Knockout visible绑定使用方法
2013/11/15 Javascript
如何用js 实现依赖注入的思想,后端框架思想搬到前端来
2015/08/03 Javascript
JS实现带提示的星级评分效果完整实例
2015/10/30 Javascript
JS三级可折叠菜单实现方法
2016/02/29 Javascript
json定义及jquery操作json的方法
2016/09/29 Javascript
浅析Jquery操作select
2016/12/13 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
JS实现微信里判断页面是否被分享成功的方法
2017/06/06 Javascript
js提取中文拼音首字母的封装工具类
2018/03/12 Javascript
vue踩坑记录之数组定义和赋值问题
2019/03/20 Javascript
layer的prompt弹出框,点击回车,触发确定事件的方法
2019/09/06 Javascript
VUEX 数据持久化,刷新后重新获取的例子
2019/11/12 Javascript
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
js实现小球在页面规定的区域运动
2020/06/16 Javascript
JavaScript 实现轮播图特效的示例
2020/11/05 Javascript
使用python绘制人人网好友关系图示例
2014/04/01 Python
Python解决鸡兔同笼问题的方法
2014/12/20 Python
Python使用pymysql从MySQL数据库中读出数据的方法
2018/07/25 Python
python科学计算之numpy——ufunc函数用法
2019/11/25 Python
pygame用blit()实现动画效果的示例代码
2020/05/28 Python
Python多线程的退出控制实现
2020/08/10 Python
护士试用期自我鉴定
2014/02/08 职场文书
护理助产毕业生的求职信
2014/03/02 职场文书
公务员更新知识培训实施方案
2014/03/31 职场文书
《去年的树》教学反思
2014/04/11 职场文书
2014年高一班主任工作总结
2014/12/05 职场文书
2015年乡镇工会工作总结
2015/05/19 职场文书
MySQL pt-slave-restart工具的使用简介
2021/04/07 MySQL
Golang实现可重入锁的示例代码
2022/05/25 Golang