2017-04-26 20 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

しかし、とにかく公共$タイプ= 'タクシー';私はそれがうまく動作しているエラーを与えていません – Alice

+0

はいそれは空でなければなりません、1秒私は私の答えを編集します。 –

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

関連する問題