PHP5-通过字符串初始化类-2种不同的方式

PHP5-通过字符串初始化类-2种不同的方式,php,string,class,oop,static,Php,String,Class,Oop,Static,在学习PHP OOP的工作原理时,我偶然发现了以下困惑 class Foo { static function baz() { echo 'works'; } } # 1 $a = 'Foo'; $a::baz(); # 2 Foo::baz(); PHP手册指出,自5.3.0以来,可以通过字符串()引用静态类 我不明白的是,1和2有什么不同?它们在技术上不一样吗?因为它们都是在不启动类的情况下调用静态函数的?在实际场景中#1在哪里可以应用?不同之处在于

在学习PHP OOP的工作原理时,我偶然发现了以下困惑

class Foo {

    static function baz() {
        echo 'works';
    }

}

# 1
$a = 'Foo';
$a::baz();

# 2
Foo::baz();
PHP手册指出,自5.3.0以来,可以通过字符串()引用静态类


我不明白的是,1和2有什么不同?它们在技术上不一样吗?因为它们都是在不启动类的情况下调用静态函数的?在实际场景中#1在哪里可以应用?

不同之处在于版本。在PHP5.3之前,您不能对变量使用静态方法

另外,第二个是使用类的“隐藏”。您的IDE找不到类的用法

还可以使用对象调用静态方法

class Foo {
    static function baz() {
        echo 'works';
    }
}

eval(
'$a = "Foo";
$a::baz();');

eval(
'$a = new Foo();
$a::baz();');

eval(
'Foo::baz();');

没有区别。而且这不是OOP#在现实生活中,当使用变量存储类名+静态方法而不是多态性时,1可能会用于设计糟糕的系统。为什么这不是OOP?类的使用不是封装的一部分吗(这是OOP的特征之一)?您使用类作为函数的名称空间。您可以使用纯函数进行封装。代码中甚至没有一个对象。你是说第一个对象被隐藏了吗?因为使用Netbeans 8,我可以找到使用#2而不是#1的方法。@AlexanderK.,是的,第一个。错过。