PHP中双冒号和箭头运算符的区别是什么?

65
在php web手册的侧边栏中,链接文本 addChild方法使用::作用域解析运算符,但示例中使用箭头运算符。有人能告诉我为什么吗?
3个回答

129
:: 用于静态元素,而 -> 用于实例元素。
例如:
class Example {
  public static function hello(){
    echo 'hello';
  }
  public function world(){
    echo 'world';
  }
}

// Static method, can be called from the class name
Example::hello();

// Instance method, can only be called from an instance of the class
$obj = new Example();
$obj->world();

更多关于静态概念的内容


10
需要补充说明的是,为了完整起见,“静态”方法可以像调用“实例”方法一样直接从一个实例中调用:$obj->hello()。但请注意,这并不表示静态方法依赖于类的实例。 - prodigitalson
1
@prodigitalson 但请注意,它们仍然像静态调用一样运作,所以没有$this-business xD。 - Hannes
@prodigitalson,我认为您在评论中可能提到了这个问题-但是只是为了澄清一下。是否可能在对象实例上调用静态成员,像这样:$obj::hello()?我的IDE给出了一些变量引用为$this::$variableName的错误提示信息。 - kalenjordan
1
你不能使用对象实例来调用它们,而是需要使用类名来调用它们。取代 $this::methodName(),你需要使用 self::methodName() 或者 TheClass::methodName()。自从 5.3 版本以后,你也可以使用字符串形式的类名 $classname 来调用方法,如下所示:$classname::methodName() - prodigitalson

4

这只是表示它是对象的方法,与实际使用无关的符号。

在文档中,您不处理像$object这样的对象实例,因此->运算符是不正确的,因为您想要列出实际的类名。因此,遵循静态方法的用法,其中类名是静态的,您使用作用域解析运算符::...

这通常是php文档中类的工作方式。


4
箭头表示addChild作为对象的成员被调用(在这种情况下是$sxe)。
双冒号表示addChild是SimpleXMLElement类的成员。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接