是什么区别 - >和::在OOP中

时间:2012-02-07 11:32:49

标签: php

试图找到一些相关信息,但由于使用了字符,我无法获得任何结果。

以下内容之间有什么区别,因为我收集他们做同样的事情。

$classname->function()
Classname::function()

第二个示例是否自动实例化对象?

3 个答案:

答案 0 :(得分:3)

前者(->)用于调用非静态成员(方法或函数/属性或变量),而后者(::)用于调用静态成员。

非静态的:

class foo{
  function bar(){ echo 'test';  }
}

$foo = new foo();
$foo->bar();

静态:

class foo{
  static function bar(){ echo 'test';  }
}

foo::bar(); // no class initialization needed

有关详细信息,请参阅此问题:

PHP: Static and non Static functions and Objects

为了更好地理解这个概念,你应该看看what static methods are以及它们与非静态的不同。

答案 1 :(得分:1)

不,第二个是调用静态方法。 Check here

答案 2 :(得分:1)

第二个示例不会自动实例化对象。因此,在第二种调用方式中,如果您在函数中使用了$ this,则会出现如下错误: PHP致命错误:在不在对象上下文中时使用$ this 通常, - >用于调用非静态方法,::用于调用静态方法 但它在php中并不那么严格。 例如:

error_reporting(E_ALL);
class A {
    public static function staticFunc() {
        echo "static";
    }

    public function instanceFunc() {
        echo "instance";    
    }
}

A::instanceFunc(); // echo "instance"
$a = new A();
$a->staticFunc();  // echo "static"

上面调用的两个方法成功运行 因为php总是以渐进的方式实现新功能,以确保兼容性,这可能导致一些细节并不关心。 但是如果你将error_reporting级别设置为E_STRICT,你会发现如下的E_STRICT错误:
严格标准:不应静态调用非静态方法A :: instanceFunc()

这两种方式的唯一区别在于:当你用::调用方法时,你不能使用变量$ this。

但是仍然建议你像其他面向对象语言一样使用这两种严格的方法 您可以在http://www.php-internal.com/book/?p=chapt05/05-02-class-member-variables-and-methods

中获取更多信息