【问题标题】:PHP difference in accessing class methodsPHP访问类方法的区别
【发布时间】:2011-02-24 13:56:40
【问题描述】:

$foo->bar() 和 $foo::bar() 有什么区别?

【问题讨论】:

标签: php class methods


【解决方案1】:

$foo::bar() 是静态方法bar() 的调用,这意味着对象$foo 没有被__construct() 方法实例化。

调用$foo->bar()时,必须先实例化对象$foo!示例:

$foo = new Foo; // internally the method __constuct() is called in the Foo class!
echo $foo->bar(); 

您通常不会像您的示例 ($foo) 那样在现有对象上调用静态方法,您可以直接在 Foo 类上调用它:

 Foo::bar();

【讨论】:

  • 什么应该是“这意味着对象 $foo 没有被 __construct() 方法实例化。”意思是?不调用 __construct() 就不可能实例化对象:?
  • 在@KingCrunch,当没有定义 __construct 方法时,可以在没有(自动)调用 __construct() 的情况下实例化对象。但这没有多大意义,在这种情况下,您会选择以静态方式调用所有其他方法。
【解决方案2】:

第一个

$foo->bar();

你调用(对象)方法,而用

Foo::bar();

你调用类(静态)方法。

可以在对象上调用类方法。也就是说,你的第二个例子是做什么的。所以这个

$foo = new Foo;
$foo::bar();

等同于

Foo::bar();

甚至

$classname = get_class($foo);
$classname::bar();

更新: 错过了什么 $foo 也可以只是一个带有类名的字符串。

$foo = 'Baz';
$foo::bar(); // Baz::bar();

【讨论】:

  • -1:很抱歉投了反对票,但是在对象上调用静态方法会导致 PHP 发出通知,这可能意味着代码并不完全正确。以我的拙见,不幸的是,许多人认为这是一种理所当然的做法。
  • 我说有可能,但这不是一个好主意。那么,这正是提问者想知道的。 PHP5.3 及更高版本将不再发出通知。但是,我同意,这不是很好的做法。 (好吧,也许我忘了,$foo 也可以是字符串^^)
猜你喜欢
  • 2012-08-30
  • 2021-01-17
  • 1970-01-01
  • 2019-06-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-20
  • 1970-01-01
  • 2015-03-31
相关资源
最近更新 更多