繁体   English   中英

OOP中->和::之间的区别是什么

[英]Whats the difference between -> and :: in OOP

尝试查找有关此信息,但由于使用的字符,可能无法获得任何结果。

从我收集到的内容来看,以下内容之间有什么区别?

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

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

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

非静态:

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:静态和非静态函数和对象

为了更好地理解该概念,您应该检查什么是静态方法以及它们与非静态方法有何不同。

不,第二个方法是调用静态方法。 在这里检查

第二个示例不会自动实例化该对象。 因此,在第二种调用方式中,如果在函数中使用了$ 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中获取更多信息

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM