2012-02-07 91 views
-1

试图找到关于此的一些信息,但我不能得到任何结果可能是由于使用的字符。OOP中的 - >和::之间的区别是什么

以下是什么区别,因为我收集他们做同样的事情。

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

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

+2

得到更多的信息这已经被覆盖了一百万次。你的PHP书在哪里? – 2012-02-07 11:36:20

+0

[参考 - 这是什么符号在PHP中的意思?](http://stackoverflow.com/questions/3737139/reference-what-does-this-symbol-mean-in-php) – hakre 2012-07-12 16:44:29

回答

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

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

+0

这真的清除了事情对我来说,我不知道他们有不同的名字是诚实的。非常感谢,但。 – 2012-02-07 12:25:50

+0

@ShaneJones:不客气 – Sarfraz 2012-02-07 12:27:07

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

相关问题