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
ThinkPHP与PHPExcel冲突解决方法
Aug 08 PHP
使用php计算排列组合的方法
Nov 13 PHP
PHP扩展CURL的用法详解
Jun 20 PHP
php操作MongoDB类实例
Jun 17 PHP
php如何获取文件的扩展名
Oct 28 PHP
PHP MYSQL实现登陆和模糊查询两大功能
Feb 05 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
PHP导出带样式的Excel示例代码
Aug 28 PHP
php-fpm服务启动脚本的方法
Apr 27 PHP
laravel-admin 后台表格筛选设置默认的查询日期方法
Oct 03 PHP
Thinkphp5+Redis实现商品秒杀代码实例讲解
Dec 29 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 5.0创建图形的巧妙方法
2010/10/12 PHP
php中存储用户ID和密码到mysql数据库的方法
2013/02/06 PHP
php定界符
2014/06/19 PHP
php 解决扫描二维码下载跳转问题
2017/01/13 PHP
Laravel框架中集成MongoDB和使用详解
2019/10/17 PHP
extjs 学习笔记 四 带分页的grid
2009/10/20 Javascript
关于textarea提交的内容无法换行的解决办法
2013/04/09 Javascript
parentElement,srcElement的使用小结
2014/01/13 Javascript
jQuery获取(选中)单选,复选框,下拉框中的值
2014/02/21 Javascript
Linux下使用jq友好的打印JSON技巧分享
2014/11/18 Javascript
JS中处理时间之setUTCMinutes()方法的使用
2015/06/12 Javascript
javascript中不易分清的slice,splice和split三个函数
2016/03/29 Javascript
浅谈vue的几种绑定变量的值 防止其改变的方法
2018/03/01 Javascript
小程序实现单选多选功能
2018/11/04 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
JS脚本实现定时到网站上签到/签退功能
2020/04/22 Javascript
解决vue打包 npm run build-test突然不动了的问题
2020/11/13 Javascript
python检测lvs real server状态
2014/01/22 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
调试Python程序代码的几种方法总结
2015/04/28 Python
快速入门python学习笔记
2017/12/06 Python
python通过配置文件共享全局变量的实例
2019/01/11 Python
Python自定义一个异常类的方法
2019/06/27 Python
Python单元测试工具doctest和unittest使用解析
2019/09/02 Python
python实现快递价格查询系统
2020/03/03 Python
Python基于codecs模块实现文件读写案例解析
2020/05/11 Python
详解python UDP 编程
2020/08/24 Python
python 实现socket服务端并发的四种方式
2020/12/14 Python
使用Django的JsonResponse返回数据的实现
2021/01/15 Python
HTML5 移动页面自适应手机屏幕四类方法总结
2017/08/17 HTML / CSS
英国工具中心:UK Tool Centre
2017/07/10 全球购物
20世纪40年代连衣裙和复古服装:The Seamstress Of Bloomsbury
2018/07/24 全球购物
电工工作职责范本
2014/02/22 职场文书
组工干部演讲稿
2014/09/02 职场文书
党员批评与自我批评思想汇报(集锦)
2014/09/14 职场文书
RPM包方式安装Oracle21c的方法详解
2021/08/23 Oracle