ホームページ  >  記事  >  バックエンド開発  >  _set() に関する質問

_set() に関する質問

WBOY
WBOYオリジナル
2016-06-13 13:05:29767ブラウズ

__set()





PHP コードに関する質問
<!--

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");
?>





上記 コード内, __set()が不可解に2回実行されてしまうのはなぜでしょうか? 出力結果は次のとおりです:

CEO::__construct begin!

Employee::__set は $proName==name, $value==Blus と呼ばれます

Employee::__set $proName==xproName、$value==Blus

CEO::__construct end!








------解決策----------------------__set( $property, $value ): 不明な値を与えますvalue 定義した属性を代入するときに呼び出されます。
値を 2 回代入すると、当然 2 回実行されます。

------解決策---------初めての名前割り当てで未定義のクラスメンバー $ を与える: $this->name = $name; 1 回呼び出します
オーバーロードされたメソッド __set を呼び出すときに、未定義のクラス メンバー $xproName に 2 回目に値を割り当てます。 。
あなたの本来の意図は次のとおりだと思います:

PHP コード
パブリック関数 __set($xproName, $value) { echo '

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>
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。