1

对于某些用户级调试,我想知道从哪个变量调用了某个类的某个属性。所有课程都是stdClass,所以我无法在那个方向寻找答案。

假设我有一个Person具有属性的类NameSex. 设置看起来像$oPerson = new Person()。当我打电话时,$oPerson->FirstName = 'Jack';我想弄清楚电话是从$oPerson. 这可以实现吗?

4

1 回答 1

0

这并不完美(请参阅此处了解我的灵感以及为什么不完美),但这是一个开始:

class Person {
    var $name;
    var $sex;

    function Person() {
        $this->name = "Jon";
        $this->sex = "male";
    }

    function __get($name) {
        $var_name = "";
        foreach ($GLOBALS as $key => $val) {
            if ($val === $this) {
                $var_name = $key;
                break;
            }
        }

        echo "Getting undefined '$name' from '\$$var_name'.\n";

        $trace = debug_backtrace();
        trigger_error(
            'Undefined property via __get(): ' . $name .
            ' in ' . $trace[0]['file'] .
            ' on line ' . $trace[0]['line'],
            E_USER_NOTICE);

        return null;
    }
}

$oPerson = new Person();
$name = $oPerson->name;
$fullname = $oPerson->fullname;

例如,以下内容将不起作用:

class Nerd {
    var $person;

    function Nerd() {
        $person = new Person();
        $nerd_fullname = $person->fullname;
    }
}

因为 的$person属性Nerd不是全局的,所以没有出现在 中$GLOBALS,也不在Persons的魔法函数范围内__get()

于 2012-08-23T13:43:02.697 回答