はい、いくつかの違いがあります。
#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