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 fread()使用技巧
Jan 22 PHP
基于curl数据采集之单页面并行采集函数get_htmls的使用
Apr 28 PHP
浅析PHP的静态成员函数效率更高的原因
Jun 13 PHP
常用PHP框架功能对照表
Oct 23 PHP
PHP动态柱状图实现方法
Mar 30 PHP
php使用cookie实现记住用户名和密码实现代码
Apr 27 PHP
php使用array_search函数实现数组查找的方法
Jun 12 PHP
php实现的Curl封装类Curl.class.php用法实例分析
Sep 25 PHP
PHP简单实现遍历目录下特定文件的方法小结
May 22 PHP
form自动提交实例讲解
Jul 10 PHP
PHP实现基于栈的后缀表达式求值功能
Nov 10 PHP
Yii框架where查询用法实例分析
Oct 22 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
一台收音机,让一家人都笑逐颜开!
2020/08/21 无线电
基于PHP异步执行的常用方式详解
2013/06/03 PHP
基于simple_html_dom的使用小结
2013/07/01 PHP
php生成短域名函数
2015/03/23 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
复制Input内容的js代码_支持所有浏览器,修正了Firefox3.5以上的问题
2010/06/21 Javascript
js 自制滚动条的小例子
2013/03/16 Javascript
判断某个字符在一个字符串中是否存在的js代码
2014/02/28 Javascript
Javascript排序算法之合并排序(归并排序)的2个例子
2014/04/04 Javascript
Html5的placeholder属性(IE兼容)实现代码
2014/08/30 Javascript
JavaScript计算两个日期时间段内日期的方法
2015/03/16 Javascript
探究Javascript模板引擎mustache.js使用方法
2016/01/26 Javascript
jQuery插件WebUploader实现文件上传
2016/11/07 Javascript
angular2中router路由跳转navigate的使用与刷新页面问题详解
2017/05/07 Javascript
vue单页缓存存在的问题及解决方案(小结)
2018/09/25 Javascript
JavaScript两种计时器的实例讲解
2019/01/31 Javascript
在vue中使用Echarts画曲线图的示例
2020/10/03 Javascript
vue 如何从单页应用改造成多页应用
2020/10/23 Javascript
在vue中嵌入外部网站的实现
2020/11/13 Javascript
[05:09]2016国际邀请赛中国区预选赛淘汰赛首日精彩回顾
2016/06/29 DOTA
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python求众数问题实例
2014/09/26 Python
python基于BeautifulSoup实现抓取网页指定内容的方法
2015/07/09 Python
浅析Python中signal包的使用
2015/11/13 Python
基于Python实现的微信好友数据分析
2018/02/26 Python
对pandas中Series的map函数详解
2018/07/25 Python
python 遍历列表提取下标和值的实例
2018/12/25 Python
Python读取excel文件中带公式的值的实现
2020/04/17 Python
Python基于pip实现离线打包过程详解
2020/05/15 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
摩顿布朗英国官方网上商店:奢华沐浴、身体和头发护理
2016/10/29 全球购物
TCP/IP模型的分界线
2012/12/01 面试题
少先队入队仪式主持词
2015/07/04 职场文书
Python 全局空间和局部空间
2022/04/06 Python
Github 使用python对copilot做些简单使用测试
2022/04/14 Python
如何vue使用el-table遍历循环表头和表体数据
2022/04/26 Vue.js