5
class Dog {

    protected $bark = 'woof!';

    public function __get($key) {
        if (isset($this->$key)) {
            return $this->$key;
        }
    }
    public function __set($key, $val) {
        if (isset($this->$key)) {
             $this->$key = $val;
        }
    }
 }

これらの機能を使用するポイントは何ですか。

私が使用できる場合

$dog = new Dog();
$dog->bark = 'woofy';
echo $dog->bark;

なぜ私はわざわざ「樹皮」を宣言するのでしょうprotectedか?この場合の__get()and__set()メソッドは、「樹皮」を効果的に公開しますか?

4

3 に答える 3

4

この場合、$this->bark値を直接設定および取得するだけなので、効果的に公開されます。ただし、getterメソッドを使用すると、内容の検証やクラスの他の内部プロパティの変更など、設定時にさらに多くの作業を行うことができます。

于 2011-07-19T02:22:47.870 に答える
3

必ずしもオブジェクトのプロパティで使用する必要はありません。

それが彼らを強力にするものです。

class View extends Framework {

    public function __get($key) {
        
        if (array_key_exists($key, $this->registry)) {
            return trim($this->registry[$key]);
        }

    }
}

基本的に、オブジェクトプロパティのゲッターやセッターとして使用する必要がないことを示しています。

于 2011-07-19T02:20:23.677 に答える
2

あなたは通常それらを決して去ることはなく、あなたがそれを去ったの__get__setまったく同じです。

これらの方法が役立つ方法はたくさんあります。これらのメソッドで実行できる可能性のある例をいくつか示します。

プロパティを読み取り専用にすることができます。

protected $bark = 'woof!';
protected $foo = 'bar';

public function __get($key) {
    if (isset($this->$key)) {
        return $this->$key;
    }
}
public function __set($key, $val) {
    if ($key=="foo") {
         $this->$key = $val; //bark cannot be changed from outside the class
    }
}

実際にデータを取得または設定する前に、持っているデータを使って何かを行うことができます。

// ...
public $timestamp;

public function __set($var, $val)
{
    if($var == "date")
    {
        $this->timestamp = strtotime($val);
    }
}

public function __get($var)
{
    if($var == date)
    {
        return date("jS F Y", $this->timestamp);
    }
}

使用できるもう1つの簡単な例は__set、データベースの行を更新することです。したがって、必ずしもクラス内にあるとは限らないものを変更しますが、クラスを使用して、変更/受信方法を簡素化します。

于 2011-07-19T02:30:55.300 に答える