2017-03-18 11 views
3

のは、単純な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を使用する必要があります)。

+0

__set()は、アクセスできないプロパティにデータを書き込むときに実行されます。 __get()は、アクセスできないプロパティからデータを読み込むために利用されます。マジックメソッドはゲッターやセッターの代わりではありません。メソッドコールやプロパティアクセスを処理するだけで、エラーが発生する可能性があります。したがって、エラー処理にははるかに関連しています。また、適切なゲッターとセッターまたは直接メソッド呼び出しを使用するよりもかなり遅いことにも注意してください。 – Scaffold

答えて

1
<?php 
ini_set("display_errors", 1); 
class Test 
{ 
    protected $name="ss"; 
    public function __set($property, $value) 
    { 
     //Checked for undefined properties 
     if(!isset(get_object_vars($this)[$property])) 
     { 
      throw new Exception("Property {$property} does not exit");    
     } 
     //Checking for public properties 
     $prop = new ReflectionProperty($this, "name"); 
     if(!$prop->isPublic()) 
     { 
      throw new Exception("Property {$property} does not exit");    
     } 
     //Checking for non-existing properties 
     if (!property_exists($this, $property)) 
     { 
      throw new Exception("Property {$property} does not exit"); 
     } 
     $this->$property = $value; 
    } 
} 

$test = new Test(); 
$test->x = 20; 
echo $test->x; 
+0

これは問題のタイプミスで、問題はこれに関するものではありません。 –

+0

@MarcinNabiałek '質問:クラス外のオブジェクトのプロパティを動的に作成できないようにする方法はありますか?あなたの質問にこれを書いています。 –

+0

はい、これは私が示したコードです。それは私が言及した他の問題を解決しませんし、簡単な問題のための非常に複雑な解決策であれば、それはありませんか? –

関連する問題