1
<?php

class Magic_Methods
{
    protected $meta;

    public function __construct() 
    {
        $this->meta = (object) array(
            'test' => 1
        );
    }

    public function __isset($name) 
    {
        echo "pass isset {$name} \n";

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

    public function __get($name) 
    {
        echo "pass get {$name} \n";

        return $this->$name;
    }
}

$mm = new Magic_Methods();

$meta = empty($mm->meta->notExisting);

var_dump($meta);

echo "||\n";

$meta = empty($mm->meta);

var_dump($meta);

上記のスニペットは期待どおりに機能しません。最初の empty() が __isset を省略するのはなぜですか? 私はこれを得る:

pass get meta 
bool(true)
||
pass isset meta 
pass get meta 
bool(false)

同じ結果または での別のパスを期待していまし__issetたが、 への直接呼び出しは期待していませんでした__get。それとも、ここで何か不足していますか?

4

2 に答える 2

2

ここを読むhttp://www.virendrachandak.com/techtalk/php-isset-vs-empty-vs-is_null/

  • isset () は存在のみを気にし、null 性は気にしません
  • empty () はデータ型を考慮し、データを考慮するには値が必要です
于 2012-10-19T22:59:05.920 に答える
0

empty への最初の呼び出しで、メタを「取得」しようとしているため、メタ内で「notExisting」が空であるかどうかをテストできます。$meta はマジック メソッドを持たない汎用 std クラスであるため、出力を取得することはできません ($meta は Magic_Methods のインスタンスではないため、Magic_Methods::__get は呼び出されません)。

empty への 2 回目の呼び出しで、meta が設定されているかどうかを確認するため、isset は true を返します。claudrian が言うように、空は値に依存するため、値が空かどうかを判断できるように、次にメタを「取得」しようとします。空ではないため、空は false を返します。2 番目の呼び出しを空の isset に変更すると、true を返す isset のみが呼び出されます。

于 2012-10-19T23:50:15.570 に答える