4

次のコードのような __isset マジック メソッドを実装しようとすると、

未定義のインデックス エラーが常に発生するのはなぜですか? 誰も私に方法を教えてもらえますか?

class c {
    public $x = array();
    public function __get($name) {
        return $this->x[$name]; //undefined index: #1:a / #2:b / #3:d
    }
    public function __isset($name) {
        return isset($this->x[$name]);
    }
}

$c = new c;
var_dump(isset($c->a));      
var_dump(isset($c->a->b));   #1
var_dump(isset($c->b->c));   #2
var_dump(isset($c->d['e'])); #3

次のコードが正常に機能するのはなぜですか? 理解できない?

$x = array();
var_dump(isset($x->a->b->c));       
var_dump(isset($x['a']['b']['c']));
4

2 に答える 2

1

PHP エンジンは、PHP の非表示のプロパティに__isset()アクセスするたびに呼び出されることを期待しているかもしれません。しかし、それは真実ではありませんドキュメントを確認してください:

__isset() は、アクセスできないプロパティで isset() または empty() を呼び出すことによってトリガーされます。

したがって、それは予想される動作です。

var_dump(isset($c->a));

トリガーし__isset()ます。

他のすべての行は単にトリガーし__get()ます。これらのインデックスを設定しなかったため、これは予想される動作です。

コードを次のように変更します。

class c {
    public $x = array();
    public function __get($name) {
        var_dump(__METHOD__);
        return $this->x[$name];
    }
    public function __isset($name) {
        var_dump(__METHOD__);
        return isset($this->x[$name]);
    }
}

どのメソッドが実際に呼び出されているかを確認します。これにより、次のことが得られます。

c::__isset   <------ called!
bool(false)
c::__get

Notice: Undefined index: a in /tmp/a.php on line 6

Call Stack:
    0.0002     647216   1. {main}() /tmp/a.php:0
    0.0003     648472   2. c->__get() /tmp/a.php:16

<---------------------- not called 
bool(false)
c::__get

Notice: Undefined index: b in /tmp/a.php on line 6

Call Stack:
    0.0002     647216   1. {main}() /tmp/a.php:0
    0.0005     648656   2. c->__get() /tmp/a.php:17

<---------------------- not called     
bool(false)
c::__get

Notice: Undefined index: d in /tmp/a.php on line 6

Call Stack:
    0.0002     647216   1. {main}() /tmp/a.php:0
    0.0006     648840   2. c->__get() /tmp/a.php:18

<---------------------- not called     
bool(false)
于 2013-05-02T22:13:47.730 に答える