0

私はしばらくの間Pradophpフレームワークを学んでいますが、それがPHPからのものなのか、それとも何らかの形でPradoに実装されているのか、1つの機能について疑問に思っています。

つまり、Pradoで使用されるクラスは、クラス自体では宣言されていないが、setメソッドとgetメソッドによって「定義」されているプロパティ(フィールド)を利用できます。

次に例を示します。

class myClass extends somePradoClass {

    public function myPradoMethod() {
        $MyVariable = 22;
        echo $MyOtherVariable; // this one is read only (only get method defined)
    }

    public function getMyVariable() {
        return 0;
    } 

    public function setMyVariable($value) {
        $this->isFieldFromParentClass = $value;
    }

    public function getMyOtherVariable() {
        return $this->isOtherFieldFromParentClass;
    }

}

さて、どういうわけか、クラスのプロパティとして宣言されているかのように、クラス全体で$MyVariableと$MyOtherVariableを使用することはまったく問題ありません。

それで、もう一度質問してください:これはPHPまたはプラドの機能ですか?

どうも

4

2 に答える 2

1

これは PHP の機能でも Prado の機能でもありません。Prado はわかりませんが、PHP にはそのような機能がないため、Prado にもありません ;)

ただし、探しているのは次のようなものです。$this->myUndefinedMember = $something

あなたの例ではローカル変数を使用していますが、これらは自動的に設定および読み取りすることはできません。

__set定義されている場合、これはマジックメソッドを呼び出します。

プラドは、通常使用する特定のスーパークラスに対してこのメ​​ソッドを定義し、その変数名に対してセッターメソッドが定義されているかどうかを動的にチェックできます (そうかどうかはわかりません)。

署名は次のとおりです。

public function __set($name, $value)

maigc メソッド__get($name)も同様に機能します。

パブリックとして設定しない場合、このプロパティのような機能はクラス (またはサブクラス) 内からのみ使用できます。

参考までに、PHP5 の機能またはプロパティとメソッドのオーバーロードについては、こちらを参照してください。

アップデート

サンプル実装は次のようになります。

class MyMagicSuperClass{
    public function __get($name){
        $getter_name = 'get'.ucwords($name);
        if(method_exists($this, $getter_name){
            return $this->$getter_name();
        }

        //error handling
    }

    public function __set($name, $value){
        $setter_name = 'get'.ucwords($name);
        if(method_exists($this, $setter_name){
            return $this->$setter_name($value);
        }

        //error handling
    }
}
于 2010-12-17T08:27:44.480 に答える
1

私はこれに非常に遅く答えますが、答えが単純な機能を非常に混乱させると感じました.

もっと簡単な答えを出すために。TComponent から継承する Prado クラスはすべて、__set および __get 関数を使用します。

PHPマジック関数の詳細はこちら

したがって、「get」または「set」で始まる関数がある場合、残りの関数名をフィールドとして使用すると、それらが呼び出されます。

これは __get の実際の prado コードです __set はほぼ同じです

    public function __get($name)
{
    $getter='get'.$name; $jsgetter = 'getjs'.$name;
    if(method_exists($this,$getter))
    {
        // getting a property
        return $this->$getter();
    }
    else if(method_exists($this,$jsgetter))
    {
        // getting a property
        return (string)$this->$jsgetter();
    }
    else if(strncasecmp($name,'on',2)===0 && method_exists($this,$name))
    {
        // getting an event (handler list)
        $name=strtolower($name);
        if(!isset($this->_e[$name]))
            $this->_e[$name]=new TList;
        return $this->_e[$name];
    }
    else
    {
        throw new TInvalidOperationException('component_property_undefined',get_class($this),$name);
    }
}
于 2012-09-18T16:08:43.077 に答える