PHP中类内调用非静态方法是否已经被弃用?

3

根据PHP手册的说明

从PHP 7.0.0开始,静态调用非静态方法已经被普遍弃用(即使从兼容的上下文中调用)。

验证这一说法-

我在类外部调用了一个非静态方法,然后就会产生错误。

class A{
    public function foo(){
        echo "testing<br/>";
    }
}
A::foo();

已弃用:不应静态调用 A::foo() 方法

但是当我在类内部调用一个非静态方法时,它不会生成 Deprecated error

class A{
    public function foo(){
        echo "testing<br/>";
    }

    public function Display(){
        A::foo();    //calling a Non-static method inside statically
        self::foo(); //calling a Non-static method inside statically
    }
}
$obj=new A();
$obj->Display();

只有在从类外静态调用时才会被弃用吗?

尝试使用静态方法。 - tkausl
在类内部,您可以使用类名访问所有数据或方法,无需定义静态数据或方法。但是,在类外部,如果没有使用static关键字定义,您不能使用类名访问数据和方法,只能通过类对象进行访问。 - Bhargav Chudasama
2个回答

5
作用域解析运算符,或双冒号运算符,并不仅用于静态调用。
在类内部,该运算符可用于以非静态方式引用类本身。
这就是您对 self::foo() 和 A::foo() 所做的操作;要在类内进行静态调用,需要使用 static::<methodName> 语句。
请参阅此处:http://php.net/manual/en/language.oop5.paamayim-nekudotayim.php

1

在类方法中使用A::self::,相当于使用$this->。详情请参见文档

警告 在PHP 7中,静态地调用非静态方法已被弃用,将会生成一个E_DEPRECATED警告。未来可能会取消静态调用非静态方法的支持。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接