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高手?学会“懒惰”的编程
Dec 05 PHP
基于php设计模式中单例模式的应用分析
May 15 PHP
php 强制下载文件实现代码
Oct 28 PHP
php遍历文件夹所有文件子文件夹函数代码
Nov 27 PHP
PHP动态编译出现Cannot find autoconf的解决方法
Nov 05 PHP
php实现从上传文件创建缩略图的方法
Apr 02 PHP
php操作memcache缓存方法分享
Jun 03 PHP
Zend Framework教程之Zend_Config_Xml用法分析
Mar 23 PHP
ThinkPHP防止重复提交表单的方法实例分析
May 10 PHP
PHP PDOStatement::fetchColumn讲解
Jan 31 PHP
PHP getName()函数讲解
Feb 03 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 25 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将会员数据导入到ucenter的代码
2010/07/18 PHP
php操作XML、读取数据和写入数据的实现代码
2014/08/15 PHP
Javascript与PHP验证用户输入URL地址是否正确
2014/10/09 PHP
php将HTML表格每行每列转为数组实现采集表格数据的方法
2015/04/03 PHP
php 如何获取文件的后缀名
2016/06/05 PHP
php生成mysql的数据字典
2016/07/07 PHP
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
Javascript selection的兼容性写法介绍
2013/12/20 Javascript
改变隐藏的input中value的值代码
2013/12/30 Javascript
jQuery实现长按按钮触发事件的方法
2015/02/02 Javascript
angularjs实现的购物金额计算工具示例
2018/05/08 Javascript
详解Koa中更方便简单发送响应的方式
2018/07/20 Javascript
bootstrap动态调用select下拉框的实例代码
2018/08/09 Javascript
vue cli3.0结合echarts3.0与地图的使用方法示例
2019/03/26 Javascript
小试小程序云开发(小结)
2019/06/06 Javascript
react用Redux中央仓库实现一个todolist
2019/09/29 Javascript
Vue实现图片与文字混输效果
2019/12/04 Javascript
Vue使用轮询定时发送请求代码
2020/08/10 Javascript
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
python爬虫框架scrapy实战之爬取京东商城进阶篇
2017/04/24 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
详解python使用pip安装第三方库(工具包)速度慢、超时、失败的解决方案
2018/12/02 Python
pyqt 多窗口之间的相互调用方法
2019/06/19 Python
python画图把时间作为横坐标的方法
2019/07/07 Python
python pip源配置,pip配置文件存放位置的方法
2019/07/12 Python
对Django中static(静态)文件详解以及{% static %}标签的使用方法
2019/07/28 Python
Python里面如何拷贝一个对象
2014/02/17 面试题
求职教师自荐书
2014/06/19 职场文书
工厂标语大全
2014/10/06 职场文书
离婚上诉状范文
2015/05/23 职场文书
中国合伙人观后感
2015/06/02 职场文书
名人传读书笔记
2015/06/26 职场文书
写作技巧:如何撰写商业计划书
2019/08/08 职场文书
python实现求纯色彩图像的边框
2021/04/08 Python
python中的mysql数据库LIKE操作符详解
2021/07/01 MySQL