zoukankan      html  css  js  c++  java
  • 《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();
  • 相关阅读:
    Vivian's Problem UVA
    Prime k-tuple UVA
    M
    Make a Crystal UVA
    Cryptography Reloaded UVALive
    Gauss Prime UVA
    Discrete Square Roots UVALive
    The Bells are Ringing UVALive
    Huge Mods UVA
    指数循环节
  • 原文地址:https://www.cnblogs.com/jiqing9006/p/3190823.html
Copyright © 2011-2022 走看看