3

誰かが魔法の方法をより簡単に理解するのを手伝ってくれます.

魔法のメソッドがコードのある時点でトリガーされることは知っていますが、理解できないのは、それらがトリガーされるポイントです。同様に、__construct() の場合、それらはクラスのオブジェクトの作成時点でトリガーされ、渡されるパラメーターはオプションです。

__get()特に、__set()__isset()__unset()がトリガーされるタイミングを教えてください 。他に魔法の方法があれば教えていただけると助かります。

4

2 に答える 2

3

PHP のマジック メソッドはすべて「__」で始まり、クラス内でのみ使用できます。以下に例を書いてみました。

class Foo
{
    private $privateVariable;
    public $publicVariable;

    public function __construct($private)
    {
        $this->privateVariable = $private;
        $this->publicVariable = "I'm public!";
    }

    // triggered when someone tries to access a private variable from the class
    public function __get($variable)
    {
        // You can do whatever you want here, you can calculate stuff etc.
        // Right now we're only accessing a private variable
        echo "Accessing the private variable " . $variable . " of the Foo class.";

        return $this->$variable;
    }

    // triggered when someone tries to change the value of a private variable
    public function __set($variable, $value)
    {
        // If you're working with a database, you have this function execute SQL queries if you like
        echo "Setting the private variable $variable of the Foo class.";

        $this->$variable = $value;
    }

    // executed when isset() is called
    public function __isset($variable)
    {
        echo "Checking if $variable is set...";

        return isset($this->$variable);
    }

    // executed when unset() is called
    public function __unset($variable)
    {
        echo "Unsetting $variable...";

        unset($this->$variable);
    }
}

$obj = new Foo("hello world");
echo $obj->privateVariable;     // hello world
echo $obj->publicVariable;      // I'm public!

$obj->privateVariable = "bar";
$obj->publicVariable = "hi world";

echo $obj->privateVariable;     // bar
echo $obj->publicVariable;      // hi world!

if (isset($obj->privateVariable))
{
    echo "Hi!";
}

unset($obj->privateVariable);

結論として、これらの魔法のメソッドを使用する主な利点の 1 つは、クラスのプライベート変数にアクセスしたい場合 (これは多くのコーディング慣行に反します)、特定のものが実行されたときのアクションを割り当てることができる場合です。つまり、変数の設定、変数のチェックなどです。

注意として、__get()and__set()メソッドはプライベート変数に対してのみ機能します。

于 2013-10-19T05:09:32.393 に答える
0

二重アンダースコア (a) で始まる PHP 関数は、PHP では__マジック関数 (および/またはメソッド) と呼ばれます。これらは常にクラス内で定義される関数であり、スタンドアロン (クラス外) の関数ではありません。PHP で使用できるマジック関数は次のとおりです。

__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__isset()、__unset()、__sleep()、__wakeup()、__toString()、__invoke()、__set_state( )、__clone()、および __autoload()。

__construct()さて、これはマジック関数を持つクラスの例です:

class Animal {

    public $height;      // height of animal  
    public $weight;     // weight of animal

    public function __construct($height, $weight) 
    {
        $this->height = $height;  //set the height instance variable
        $this->weight = $weight; //set the weight instance variable
    }
}
于 2013-10-19T04:45:23.860 に答える