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 相关文章推荐
相对路径转化成绝对路径
Apr 10 PHP
PHP人民币金额数字转中文大写的函数代码
Feb 27 PHP
在wamp集成环境下升级php版本(实现方法)
Jul 01 PHP
利用浏览器的Javascript控制台调试PHP程序
Jan 08 PHP
php实现信用卡校验位算法THE LUHN MOD-10示例
May 07 PHP
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
Dec 21 PHP
php连接oracle数据库的核心步骤
May 26 PHP
基于PHP的加载类操作以及其他两种魔术方法的应用实例
Aug 28 PHP
php5.5使用PHPMailer-5.2发送邮件的完整步骤
Oct 14 PHP
php和html的区别点详细总结
Sep 24 PHP
laravel-admin解决表单select联动时,编辑默认没选上的问题
Sep 30 PHP
PHP SESSION跨页面传递失败解决方案
Dec 11 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
10个简化PHP开发的工具
2014/12/25 PHP
ThinkPHP、ZF2、Yaf、Laravel框架路由大比拼
2015/03/25 PHP
解析 thinkphp 框架中的部分方法
2017/05/07 PHP
利用PHP如何统计Nginx日志的User Agent数据
2019/03/06 PHP
js类 from qq
2006/11/13 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
浅析JavaScript中的CSS属性及命名规范
2013/11/28 Javascript
js拼接html注意问题示例探讨
2014/07/14 Javascript
推荐25个超炫的jQuery网格插件
2014/11/28 Javascript
jQuery中prev()方法用法实例
2015/01/08 Javascript
js从外部获取图片的实现方法
2016/08/05 Javascript
jquery实现转盘抽奖功能
2017/01/06 Javascript
浅谈vue-cli加载不到dev-server.js的解决办法
2017/11/24 Javascript
深入浅析JS中的严格模式
2018/06/04 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
js实现简单的随机点名器
2020/09/17 Javascript
解决Element中el-date-picker组件不回填的情况
2020/11/07 Javascript
[52:20]DOTA2-DPC中国联赛正赛 SAG vs XGBO3 第一场 3月5日
2021/03/11 DOTA
Python 判断 有向图 是否有环的实例讲解
2018/02/01 Python
Python使用selenium实现网页用户名 密码 验证码自动登录功能
2018/05/16 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
详解Django-restframework 之频率源码分析
2019/02/27 Python
解决pycharm不能自动补全第三方库的函数和属性问题
2020/03/12 Python
Python内置函数locals和globals对比
2020/04/28 Python
python批量检查两个对应的txt文件的行数是否一致的实例代码
2020/10/31 Python
html5 canvas简单封装一个echarts实现不了的饼图
2018/06/12 HTML / CSS
法学毕业生自荐信
2013/11/13 职场文书
医药代表个人的求职信分享
2013/12/08 职场文书
心理健康教育心得体会
2013/12/29 职场文书
大学生咖啡店创业计划书
2014/01/21 职场文书
2014年人力资源部工作总结
2014/11/19 职场文书
餐饮食品安全责任书
2015/01/29 职场文书
2015年入党决心书
2015/02/05 职场文书
酒店办公室主任岗位职责
2015/04/01 职场文书
2015年招商引资工作总结
2015/04/25 职场文书
工地食品安全责任书
2015/05/09 职场文书