PHP在非静态方法上调用self

时间:2013-10-07 06:18:34

标签: php class methods self non-static

为什么在这个例子中对非静态方法的'self'调用有效?

class A{

    protected function aNonStaticMethod(){
        return __class__;
    }

    public function aEcho(){
        echo self::aNonStaticMethod();
    }
}

感谢您的解释。

2 个答案:

答案 0 :(得分:7)

在你的简单例子中,$ this和self是可互换的。但是要注意处理继承时解决的不同方法(我为完整性添加了静态):

class A {
    protected function aNonStaticMethod(){
        return __class__;
    }

    public function selfEcho(){
        echo self::aNonStaticMethod();
    }

    public function staticEcho(){
        echo static::aNonStaticMethod();
    }

    public function thisEcho(){
        echo $this->aNonStaticMethod();
    }
}

class B extends A {
    protected function aNonStaticMethod(){
        return __class__;
    }
}

$b = new B();
$b->selfEcho(); // A
$b->staticEcho(); // B
$b->thisEcho(); // B

答案 1 :(得分:4)

静态调用非静态方法

理论上它应有效,但正如this评论所说:

  

php4中没有静态关键字,但php4确实允许静态   调用。为了保持向后兼容性,这是留在了   在php5中添加了static keyword。

this官方php.net wiki:

支持此评论
  

如果从实例方法进行调用,则已弃用。   不将方法注释为静态是一种过时的PHP4-ism。

你真的不应该静态地调用非静态方法 - 它没有意义(如果有 static 关键字)。

避免静态调用非静态方法完全

...因为a)这是一个糟糕的方法,b)PHP docs说:

  

<强>注意   
在PHP 5中,静态调用非静态方法会生成E_STRICT级别警告。

  

警告   
在PHP 7中,不推荐静态调用非静态方法,并将生成E_DEPRECATED警告。将来可能会删除对静态调用非静态方法的支持。

使用::运算符进行非静态调用 - 可能是一种很好的方法!

正如@Kontrollfreak所指出的那样,this docs表示::运算符不仅限于静态调用:

  双冒号,是一个允许访问静态,常量,   和重写的属性或类的方法

因此,如果您通过这种方式引用父类中的一个或多个属性 - 这是不限直接父级,则可以。