のは、単純なPHPコードを見てみましょう:が動的パブリックプロパティを作成することはできません。
<?php
class Test
{
}
$test = new Test();
$test->x = 20;
echo $test->x;
ここでの問題は、おそらくいくつかの以前のバージョンでは、それはまた働く、PHP 7.1でテスト(このコードは問題なく動作しますです問題なく)。
このようなコードを使用すると、非常に解析が難しく、隠れたバグを含む可能性があるコードを書くのは非常に簡単です。
質問:特にクラス外のオブジェクトのプロパティを動的に作成できないようにする方法はありますか?このようにではない宣言されたプロパティを作成するカスタム__set
方法作成されて使用することができ、このソリューションのようなカスタムクラスの
:
public function __set($property, $value)
{
if (!property_exists($this, $property)) {
throw new Exception("Property {$property} does not exit");
}
$this->$property = $value;
}
をしかし、それは明らかに、保護/プライベートプロパティの問題を解決しません - property_existsはprotectedプロパティとprivateプロパティに対してもtrueを返します(Reflectionを使用する必要があります)。
__set()は、アクセスできないプロパティにデータを書き込むときに実行されます。 __get()は、アクセスできないプロパティからデータを読み込むために利用されます。マジックメソッドはゲッターやセッターの代わりではありません。メソッドコールやプロパティアクセスを処理するだけで、エラーが発生する可能性があります。したがって、エラー処理にははるかに関連しています。また、適切なゲッターとセッターまたは直接メソッド呼び出しを使用するよりもかなり遅いことにも注意してください。 – Scaffold