zoukankan      html  css  js  c++  java
  • PHP类的继承

    每个子类(也叫派生类)都会在设置自己的属性前调用父类的构造方法。父类(也叫基类超类)现在仅知道自己的数据,子类一般是父类的特例,要避免告诉父类任何关于子类的信息

    以下为一个使用继承的实例:

    <?php
    
    class ShopProduct{
        private $title;             // 属性也称为成员变量,用来存放对象之间互不相同的数据
        private $producerMainName;  // 所有的属性都设置为 private,不允许外部直接访问这些属性,然后提供方法来取得需要的值
        private $producerFirstName;
        protected $price;           // 阻止外面直接访问该属性,可以被子类访问
        private $discount = 0;
    
        // 创建对象时,构造方法会被自动调用,构造方法可以确保必要的属性设置,并完成任何需要准备的工作
        public function __construct($title,$mainName,$firstName,$price){
            $this->title = $title;      // 使用伪变量$this给每个变量赋值
            $this->producerMainName = $mainName;
            $this->producerFirstName = $firstName;
            $this->price = $price;
        }
    
        /**
         * @return mixed 这种只返回属性值的方法称为“访问方法”,也称为 getter 和 setter
         */
        public function getProducerFirstName()
        {
            return $this->producerFirstName;
        }
    
        /**
         * @return mixed 获取 姓 的访问方法
         */
        public function getProducerMainName()
        {
            return $this->producerMainName;
        }
    
        /**
         * @param $num 打折的价格
         */
        public function setDiscount($num)
        {
            $this->discount = $num;
        }
    
        /**
         * @return int 折扣的访问方法
         */
        public function getDiscount()
        {
            return $this->discount;
        }
    
        /**
         * @return mixed Book名或CD名的访问方法
         */
        public function getTitle()
        {
            return $this->title;
        }
    
        /**
         * @return mixed 折扣后的价格
         */
        public function getPrice()
        {
            return ($this->price - $this->discount);
        }
    
        /**
         * @return string 作者
         */
        public function getProducer(){  // 方法让对象执行任务
            return $this->producerMainName .' '. $this->producerFirstName;
        }
    
        /**
         * @return string 发票的摘要信息
         */
        public function getSummaryLine()
        {
            $base = "{$this->title} ( {$this->producerMainName},{$this->producerFirstName}) ";
            return $base;
        }
    
    }
    
    // 若派生类没有定义构造方法,则它在实例化是会自动调用父类的构造方法。子类默认继承父类所有的 public 和 protected 方法,但不继承 private 方法和属性
    class BookProduct extends ShopProduct
    {
        private $numPages;
    
        // 每个子类在设置自己的属性前调用父类的构造方法,基类现在仅知道自己的数据,子类一般是父类的特列,应该避免告诉父类任何关于子类的消息。
        public function __construct($title,$mainName,$firstName,$price,$numPages)
        {
            // parent 关键字可以在任何复写父类方法的方法中使用,通过在当前对象中调用父类的方法来拓展父类的功能 , 要应用一个类而不是对象的方法,使用 :: 而不是 ->
            parent::__construct($title,$mainName,$firstName,$price);
            $this -> numPages = $numPages;
        }
    
        /**
         * @param $numPages 书的页数
         * @return mixed    总页数
         */
        public function getNumberOfPages()
        {
            return $this->numPages;
        }
    
        /**
         *  子类(派生类)可以覆盖和修改父类(基类或超类)的功能
         * @return string Book发票的摘要信息
         */
        public function getSummaryLine()
        {
            $base = parent::getSummaryLine();
            $base .= "page count - {$this->numPages}";
            return $base;
        }
    }
    
    class CdProduct extends ShopProduct
    {
        private $playLength;
    
        public function __construct($title,$mainName,$firstName,$price,$playLength)
        {
            parent::__construct($title,$mainName,$firstName,$price);
            $this -> playLength = $playLength;
        }
    
        /**
         * @return int 播放时间
         */
        public function getPlayLength()
        {
            return $this -> playLength;
        }
    
        /**
         * @return string CD发票的摘要信息
         */
        public function getSummaryLine()
        {
            $base = parent::getSummaryLine();
            $base .= "playing time - {$this->playLength}";
            return $base;
        }
    }
    
    $product1 = new BookProduct('Kong Yiji','Lun','Xun',59.9,200);
    $product2 = new CdProduct('The Saltwater Room','Owl','City',10.99,4);
    
    print "author : {$product1 -> getProducer()} </br>";              // author :Lun Xun
    print "book summary line: {$product1 -> getSummaryLine()}</br>"; // book summary line :Kong Yiji ( Lun,Xun) page count - 200
    print "artist : {$product2 -> getProducer()} </br>";              // artist :Owl City
    print "play length :{$product2 ->getPlayLength()}</br>";         //  play length :4

     本文是我阅读了《深入PHP 面向对象、模式与实践》一书的第三章中关于继承的部分后所作

    如有转载,请注明出处:http://www.cnblogs.com/chrdai/p/6860818.html

  • 相关阅读:
    IntelliJ Idea 常用快捷键列表
    JSON,字符串,MAP转换
    学习总是无效,是因为你没有稳定的输出系统
    华为离职副总裁徐家骏:透露年薪千万的工作感悟,太震撼了!
    Junit测试Spring应用Dubbo测试框架之-Excel 工具类
    Junit参数化测试Spring应用Dubbo接口
    TestNG参数化测试Spring应用Dubbo接口
    TestNG测试报告美化
    TestNG系列之四: TestNg依赖 dependsOnMethods
    【Java】Java_08 字符型与布尔值
  • 原文地址:https://www.cnblogs.com/chrdai/p/6860818.html
Copyright © 2011-2022 走看看