Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php5 OOP-对象类型限制不';行不通_Php_Oop - Fatal编程技术网

php5 OOP-对象类型限制不';行不通

php5 OOP-对象类型限制不';行不通,php,oop,Php,Oop,我正在学习OOP,这里有一个不理解代码的小问题 给你 class ShopProduct { private $title; private $producerMainName; private $producerFirstName; protected $price; private $discount = 0; function __construct( $name, $firstName, $mainName, $price) {

我正在学习OOP,这里有一个不理解代码的小问题

给你

class ShopProduct {

    private $title;
    private $producerMainName;
    private $producerFirstName;
    protected $price;
    private $discount = 0;


    function __construct( $name, $firstName, $mainName, $price) {
        $this->title = $name;
        $this->producerFirstName = $firstName;
        $this->producerMainName = $mainName;
        $this->price = $price;
    }

    public function getProducer() {
        return "{$this->producerMainName} "."{$this->producerFirstName} \n ";
    }

    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);
    }

    public function getSummaryLine() {
        $base = "{$this->title} ( {$this->producerMainName}, ";
        $base .= "{$this->producerFirstName} )";
        return $base;
    }
}

class CDProduct extends ShopProduct {
    private $playLength = 0;

    public function __construct($title, $firstName, $mainName, $price, $playLength) {
        parent::__construct($title, $firstName, $mainName, $price);
        $this->playLength = $playLength;
    }

    public function getPlayLength() {
        return $this->playLength;
    }

    public function getSummaryLine() {
        $base = parent::getSummaryLine();
        $base .= ": {$this->playLength()} minutes";
        return $base;
    }

}
class BookProduct extends ShopProduct {

    private $numPages = 0;

    public function __construct($title, $firstName, $mainName, $price, $numPages) {
        parent::__construct($title, $firstName, $mainName, $price);
        $this->numPages = $numPages;
    }


    public function getNumberOfPages() {
        return $this->numPages;
    }

    public function getSummaryLine() {
        $base = parent::getSummaryLine();
        $base .= ": {$this->numPages()} pages";
        return $base;
    }
}
class ShopProductWriter {

    private $products = array();
    public function addProduct($shopProduct){
        if(! ($shopProduct instanceof ShopProduct) ){
        die('object error');
        }
        $this->products[] = $shopProduct;
    }
    public function write($shopProduct) {   
        foreach($this->products as $shopProducts){
            $str = "{$shopProduct->getTitle()}: "."{$shopProduct->getProducer()}"." {$shopProduct->getPrice()}$ \n";
        }
        print $str;
    }
}
$product = new CDProduct('Song is the rythm','Zyxel','Beatz',50, 60.33);
$write = new ShopProductWriter();
$write->addProduct($product);
$write->write($product);
问题就在这里

class ShopProductWriter {

        private $products = array();
        public function addProduct($shopProduct){
            if(! ($shopProduct instanceof ShopProduct) ){
            die('object error');
            }
            $this->products[] = $shopProduct;
        }
        public function write($shopProduct) {   
            foreach($this->products as $shopProducts){
                $str = "{$shopProduct->getTitle()}: "."{$shopProduct->getProducer()}"." {$shopProduct->getPrice()}$ \n";
            }
            print $str;
        }
    }
正如您所看到的,如果对象不是ShopProduct类型,则会出现错误。 但正如您所看到的,我正在创建CDProduct对象

$product = new CDProduct('Song is the rythm','Zyxel','Beatz',50, 60.33);
$write = new ShopProductWriter();
$write->addProduct($product);
$write->write($product);

它应该显示错误。任何人都可以告诉我我做错了什么?

CDProduct的对象也是ShopProduct类型。在类定义中:

class CDProduct extends ShopProduct {
因此,它是两种类型的对象

如果对象扩展了父对象或实现了接口,则也可以将其视为该类型


您已经收到了关于为什么
CDProduct
ShopProduct
的反馈,所以我只是在PHP已经支持的一些代码中添加了另一个提示:

    public function addProduct($shopProduct){
        if(! ($shopProduct instanceof ShopProduct) ){
        die('object error');
        }
        $this->products[] = $shopProduct;
    }
您不必自己进行检查,只需利用减少代码并使其更具表现力即可:

    public function addProduct(ShopProduct $shopProduct) {
        $this->products[] = $shopProduct;
    }

我希望这有助于您目前学习OOP。

我明白了,所以当它从某个类扩展时,它从父类获取类型?Bu Aksam,当您扩展某个类时,该类将成为两种类型。所以,CDProduct和ShopProduct的CDProduct实例,以及ShopProduct的ShopProduct实例。顺便说一句,这是继承的一个特性,一般来说,你可以有一个继承链,可以有任意数量的类长。e、 你可以有一个扩展Parent1的类,它反过来又扩展Parent2,依此类推。最终基类可以被视为链上所有相同类型的对象。