php5 OOP-对象类型限制不';行不通
我正在学习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) {
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,依此类推。最终基类可以被视为链上所有相同类型的对象。