0

たとえば、2つの間に違いはありますか?一方が他方よりも優先されますか?

Class Node{    
    public $parent = null;
    public $right = null;
    public $left = null;            
    function __construct($data){
        $this->data = $data;                    
    }
}

Class Node{     
    function __construct($data){
        $this->data = $data;      
        $this->parent = null;       
        $this->left = null;       
        $this->right = null;               
    }
}
4

2 に答える 2

7

はい、いくつかの違いがあります。

#1:コンストラクターでのみ定義した場合、クラスはこれらのプロパティを持っていると正式には見なされません

class Foo {
    public $prop = null;
}

class Bar {
    public function __construct() {
        $this->prop = null;
    }
}

var_dump(property_exists('Foo', 'prop')); // true
var_dump(property_exists('Bar', 'prop')); // false

$foo = new Foo;
$bar = new Bar;

var_dump(property_exists($foo, 'prop')); // true
var_dump(property_exists($bar, 'prop')); // true

実行時の動作の違いに加えて、コンストラクターを使用してクラスにプロパティを「追加」するのは不適切な形式です。このクラスのすべてのオブジェクトにプロパティ(実質的には常に存在する必要があります)を持たせる場合は、それらを正式に宣言する必要もあります。PHPでこれを回避できるという事実は、無計画なクラス設計を許しません。

#2:コンストラクターの外部からプロパティを非定数値に初期化することはできません

例:

class Foo {
    public $prop = 'concatenated'.'strings'; // does not compile
}

この制約に関するその他の例は、PHPマニュアルに記載されています。

#3:コンストラクター内で初期化された値の場合、派生クラスが親コンストラクターの呼び出しを省略した場合、結果は予期しないものになる可能性があります

class Base {
    public $alwaysSet = 1;
    public $notAlwaysSet;

    public function __construct() {
        $this->notAlwaysSet = 1;
    }
}

class Derived extends Base {
    public function __construct() {
        // do not call parent::__construct()
    }
}

$d = new Derived;
var_dump($d->alwaysSet); // 1
var_dump($d->notAlwaysSet); // NULL
于 2013-01-14T00:46:05.633 に答える
1

いくつかの理由から、コンストラクターの外部でそれらを宣言することを好みます。

  1. コンストラクターをクリーンに保つため
  2. タイプ情報などを追加して、適切に文書化できるようにします
  3. だから私はアクセス修飾子を指定して、それらをプライベートまたは保護することができますが、パブリックにすることはめったにありません
  4. したがって、派生クラスがparent :: __construct()を呼び出さない場合も、宣言および/または初期化されます。

それらを非定数値に初期化する必要がある場合でも、コンストラクターの外部で宣言し、コンストラクターで初期化します。

于 2013-01-14T00:47:50.390 に答える