PHP:->和::之间的区别

16

可能重复:
在PHP中,::和->有什么区别?

在PHP中,使用箭头->和作用域解析运算符::调用类内部的函数时主要区别是什么?

为了更清晰地说明,下面是两种方式的区别:

$name = $foo->getName();
$name = $foo::getName();

作用域解析运算符::的主要优点是什么?

3个回答

22
$name = $foo->getName();

这将调用对象$foo的成员函数或静态函数。

$name = $foo::getName();

将调用$foo所在类的静态函数。使用::的好处是可以访问一个类的静态成员,而不需要该类的对象实例。也就是说,

$name = ClassOfFoo::getName();

:: 可以访问类的 static 成员???哇!够赚了!:D 谢谢伙计,K-ballo - 夏期劇場
如果::可以访问static成员,那么static的美在哪里?我认为这只是PHP中一种不太结构化的方式 :( - 夏期劇場
你似乎将 static 与其他东西混淆了,在所有的编程语言中,都有办法访问一个类的静态(public)成员。 - K-ballo
这个主题的更详细答案可以在这里找到: https://dev59.com/DXVC5IYBdhLWcg3w51hv#17027307 - J Z

9
  • ->被用来访问实例的方法(或实例化对象的变量)
  • ::被用于访问未实例化对象的静态函数

1
它们用于不同的函数类型。->总是用于静态和非静态方法的对象(虽然我认为对于静态方法使用->不是一个好习惯)。::仅用于静态方法,并且可以用于对象(自PHP 5.3起)更重要的是类
<?php

class aClass {
    static function aStaticMethod() {}
    function aNormalMethod() {}
}

$obj = new aClass();
$obj->aNormalMethod(); //allowed
$obj->aStaticMethod(); //allowed
$obj::aStaticMethod(); //allowed as of PHP 5.3
$class_name = get_class( $obj );
$class_name::aStaticMethod(); //long hand for $obj::aStaticMethod()
aClass::aStaticMethod(); //allowed
//aClass::aNormalMethod(); //not allowed
//aClass->aStaticMethod(); //not allowed
//aClass->aNormalMethod(); //not allowed

$obj->aStaticMethod(); //allowed 允许的????伙计,我对 -> 感到困惑。你确定它允许这样做吗? - 夏期劇場
尝试运行脚本。它可以工作,但这并不是最佳实践。 - Kendall Hopkins

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