使用新创建的$obj或使用类名访问静态方法


Accessing static methods using newly created $obj or using class Name

请参阅下面的类定义:
我目前正在使用 5.3.9 版本的 PHP

class A{
    static function ab(){
        echo "static function ab<br>";
    }
    public function xy(){
        echo "public function xy<br>";
    }
}
$obj =  new A();
$obj->ab();
A::ab();

两个函数调用都给出相同的输出,没有任何错误

static function ab
static function ab

static method怎么可能也可以由类对象调用?因为static method只能使用class name only?!调用

现在访问这两种调用static method的方式有什么区别?

参考 php.net 网站

将类属性或方法声明为静态可以使它们无需实例化即可访问。声明为 static 的属性不能使用实例化的类对象访问(尽管静态方法可以)。

一个很大的区别是

由于静态方法在没有所创建对象的实例的情况下是可调用的,因此伪变量$this在声明为 static 的方法中不可用。

有关更多详细信息,请参阅页面 php.net/manual/en/language.oop5.static.php

只要你只是回显一个简单的字符串,如果你的方法将被声明为静态或公共,就没有区别,因为静态方法也可以与对象实例一起调用。从 PHP 5.5 开始,如果您使用静态方式调用公共方法,则会引发错误。但是,可以使用classname::staticMethod()调用静态方法,因此页面应该只知道类,而不是真正需要它的实例。

另一个交易是方法内容。正如我所说,如果你只是回显一个字符串,你不需要一个静态方法。静态方法不在对象上下文中。这意味着您无法通过$this从当前对象访问属性或方法