php静态函数中没有重载

php静态函数中没有重载,php,overloading,static-methods,Php,Overloading,Static Methods,我似乎不明白为什么下面的代码只打印“TEST”两次 <?php class A { private $test = "TEST<br />"; public static function getInstance() { return new self(); } public static function someStaticMethod() { $a = new self(); $a-&g

我似乎不明白为什么下面的代码只打印“TEST”两次

<?php

class A {
    private $test = "TEST<br />";

    public static function getInstance() {
        return new self();
    }

    public static function someStaticMethod() {
        $a = new self();
        $a->test;
    }

    public function __get($args) {
        echo $this->$args;
    }
}

/* echo's "TEST" */
$a = new A();
$a->test;

/* echo's "TEST" */
$a2 = A::getInstance();
$a2->test;

/*
No output... eeerhm... how come?
Why is $a->test (inside someStaticMethod()) not being overloaded by __get ??
*/
A::someStaticMethod();

?>

PHP站点说():

属性重载仅在对象上下文中有效。这些神奇的方法不会在静态上下文中触发。因此,这些方法不应声明为静态的。从PHP5.3.0开始,如果其中一个神奇的重载方法声明为静态,则会发出警告

但是我想他们是想说你应该声明魔法方法是静态的。e、 g:

公共静态函数uu get(){}

加上事实上我在对象上下文中使用它$a=新的自我();从类A返回变量$A中的实例。然后我使用$a->test(objectcontext-imo?)获取私有的“test”变量,该变量将被重载

我很困惑…

来自:

当与尚未声明或在当前范围内不可见的属性或方法交互时,将调用重载方法


调用静态方法时,
someStaticMethod()
私有$test在当前范围内可见,因此不会调用magic\u get方法。

A::someStaticMethod
的上下文中,PHP允许您直接访问私有变量
$test
,所以魔法方法没有执行。如果您
echo$a->test从那里,您将看到它正在被访问

根据以下数据,这是预期的行为:

相同类型的对象将有权访问彼此的私有成员和受保护成员,即使它们不是相同的实例。这是因为在这些对象中,特定于实现的细节是已知的


如果可以的话,我会投票给你们两个被接受的人(.但是我怎样才能从静态方法someStaticMethod()访问$test?我知道它“在当前范围内可见”。但是我不能从静态上下文访问实例上下文,对吗?所以实际上我不能直接从someStaticMethod()访问$test)对吧?不管怎么说,这对*ss来说有点痛苦,因为我使用重载来延迟加载。所以这对我来说很可怕……有什么解决办法吗?@Marc你不能,但我把这个答案给了它应有的信任。我们通过不同的方式得出了相同的结论。