2017-04-26 52 views
0

假設我有一個一流的汽車---強制類屬性的子類

class Car{ 
    var $type; 

    function func1(){ 
    } 

    function func2(){ 
    } 
} 

現在誰正在擴大這一點,我希望他們都類發起$類型。他們必須這樣做 -

class Taxi extends class Car{ 
    var $type = 'taxi'; 
} 

我該如何做到這一點?抽象類 - 抽象變量?

回答

0

首先關閉所有你有語法錯誤,你不能使用var聲明屬性,你有語法錯誤在聲明類出租車應該是

class Taxi extends Car{ 
    public $type; 
} 

我想你想實現這樣的事情。

abstract class AbstractCar 
{ 
    public $type; 

    public function __construct() 
    { 
     $this->type = static::TYPE; 
    } 
} 

class Taxi extends AbstractCar 
{ 
    //const TYPE = 'foobar'; 
} 

$car = new Car; //Fatal Error: Undefined class constant 'TYPE' (uncomment const TYPE = 'foobar';) 
echo $car->type; 
+1

我正在找這個。謝謝:) – Alice

+0

但反正public $ type ='taxi';是不是給我任何錯誤,它工作正常 – Alice

+0

是的,它應該是空的,一秒鐘我會編輯我的答案。 –

1

做到這一點的唯一方法是使final構造內的檢查:

 
abstract class Car { 

    public $type; 

    final public function __construct() 
    { 
     if (! isset($this->type)) { 
      throw new RuntimeException(
       sprintf('%s::$type is undefined', __CLASS__) 
      ); 
     } 
    } 

} 

這個類應該是抽象的是自然的,因爲它顯然已經被擴展,但在其他方面ISN沒有必要。

+0

如果子類擁有自己的構造函數,那麼這將失敗 – Alice

+0

取決於「失敗」的含義......是的,如果子類需要工作,它根本不能擁有構造函數,但另一方面 - 除此之外,沒有其他辦法可以迫使它宣佈財產。 – Narf