__set()
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> <?php namespace longli; class Employee { private $name; public function __set($xproName, $value) { echo '<p>Employee::__set is called $proName=='.$xproName.', $value=='.$value.'</p>'; $this->xproName = $value; } } class CEO extends Employee { function __construct($name="") { echo '<h2>CEO::__construct begin!</h2>'; $this->name = $name; echo '<h2>CEO::__construct end!</h2>'; } } $boss = new CEO("Blus"); ?>
Employee::__set は $proName=='.$xproName.', $value=='.$value.'
' と呼ばれます。 // この $xproName は変数であり、内容は変数名です。 詳細については、マニュアルの「変数」を参照してください。 $this->$xproName = $value; }<br>------解決策----------------------<font color="#e78608"></font>事前定義された 2 つの関数「__get() 」と「__set」 ()" を使用して属性を取得して割り当て、属性をチェックする "__isset()" を使用します <br><br><br>//__get() メソッドはプライベート属性を取得するために使用されます <br>private function __get( $property_name )<br>{<br>if(isset($this->$property_name))<br>{<br>return($this->$property_name);<br>}else<br>{ <br>return(NULL);<br>}<br>}<br>//__set() メソッドはプライベート プロパティを設定するために使用されます<br>private function__set($property_name,$value)<br>{<br>$ this ->$プロパティ名=$値;<br>} <br><br>------解決策----------------------<font color="#e78608"></font>あなたはまだ __set() を理解していませんその結果、クラス メンバー属性 $xproName に値を割り当てた後、その値は未定義ではなくなります。したがって、無限ループの条件はありません。 <br>__set() を使用して実装されたカプセル化は過剰だと思います。なぜクラス外の隠し属性を変更するのでしょうか?なぜ公開しないのでしょうか? <br><br>「隠し属性を追加する」ということについては、<br> 隠し属性を追加しますか?プログラムに必要な属性名は固定されていませんか?最初に隠しプロパティを宣言する必要があります。 <br> <br><br>------解決策---------<font color="#e78608"></font>使用されるすべてのオブジェクト指向言語にはそれぞれのプロパティがありますには Access メソッドと Assign メソッドがあり、開発者がオブジェクトの動作を柔軟に制御できます。 php はオブジェクト指向言語ではないため、大まかな __get メソッドと __set メソッドが用意されていますが、Access や Assign と比べるとまだ大きな差があります<br>__get のみを使用し、_ _set を使用する場合は Access や Assign と同じですオブジェクトのプロパティにアクセスしますが、これは不要である可能性が非常に高くなります<br> オブジェクト内の __get と __set の役割は、属性にアクセスする際にメソッドを明示的に呼び出すことなく、暗黙的にいくつかのメソッドを実行することです<br> <br><div class="clear"></div>