PHP MySQLi OOP中“->”和“::”的区别
Posted
技术标签:
【中文标题】PHP MySQLi OOP中“->”和“::”的区别【英文标题】:Difference between "->" and "::" in PHP MySQLi OOP 【发布时间】:2010-11-17 17:22:05 【问题描述】:谁能分辨mysqli->commit
和mysqli::commit
之间的区别?
this page 中的标头是mysqli::commit
,但在示例中他们使用mysqli->commit
。
【问题讨论】:
【参考方案1】:->
用于引用对象的成员。
::
是Scope Resolution Operator,用于引用类的静态成员。
考虑以下类:
class FooBar
public static function fizz()
echo "Fizz";
public function buzz()
echo "Buzz";
您可以使用->
调用函数buzz()
:
$myFooBar = new FooBar();
$myFooBar->buzz();
但会使用::
调用函数fizz()
,因为它是静态成员(不需要调用类实例的成员):
FooBar::fizz();
此外,虽然我们正在讨论 static 成员与 实例化 成员之间的区别,但您不能使用 $this
来引用 static 中的当前实例 成员。你可以使用self
代替(没有前导$
),它指代当前类,或者parent
,如果你想引用父类,或者如果你有幸使用php 5.3.0,@987654324 @(允许后期静态绑定)。
文档使用::
来引用类中的函数,因为标题中的类名不是该类的实例。仍然使用相同的示例,引用函数 buzz()
的文档条目将使用以下标头:
FooBar::buzz
但除非文档指定它是静态成员,否则您需要在实例上使用 ->
来调用它:
$myFooBar = new FooBar();
$myFooBar->buzz();
【讨论】:
本来要发帖的,但是这个很准。简而言之,约翰没有区别。正如 Andrew 在 PHP 手册中所说的那样,将类方法描述为 ClassName::methodName 的约定是将 is 用作对象,即 $name->commit() ,除非文档中另有说明。 这个答案太棒了。如何做 FooBar::fizz()->select("something")->where("something");【参考方案2】:::
用于静态方法。
->
用于对象的方法,如果你已经有实例的话。
【讨论】:
【参考方案3】:如果你有一个对象的实例,你使用 -> 来引用这个实例中的一个方法:
$foo = new Foo();
$foo->bar();
使用 :: 调用静态方法而无需创建对象的实例:
Foo::bar();
静态方法不能通过$this
引用它的当前实例,但可以通过self
引用自身(当前类)。
【讨论】:
使用范围解析运算符调用非静态成员会在 PHP = 5.3.0 中引发 E_WARNING。 而self
的存在是为了在静态上下文中引用当前类。它不是指一个实例,而是指它自己:class A static function b() self::c(); private static function c() echo 'hello'; ;
【参考方案4】:
::
指定一个静态(类)方法,无需实际实例化对象即可调用该方法。 ->
指定一个实例(对象)方法,您需要一个实例化的对象才能使用。
例如,如果您有一个变量$m
,它是类mysqli
的一个实例,您可以通过$m->commit()
调用commit
,或者您可以通过MySQLi::commit()
静态调用提交
【讨论】:
【参考方案5】::: 访问类的函数而不实例化对象。
【讨论】:
【参考方案6】:在mysqli->commit中,mysqli是MySQLi的一个实例 在 mysqli::commit 中调用一个静态方法
【讨论】:
【参考方案7】:mysqli->commit 是一个公共函数,mysqli::commit 是一个静态函数,两者都是 mysqli 类的 php 对象表示法。
【讨论】:
【参考方案8】:通常在 php.net 文档中 :: 表示该类具有该方法。对于实际使用,您必须按照示例进行操作,因此请使用 -> sintax。
【讨论】:
【参考方案9】:->
运算符用于对象属性。
::
运算符用于类属性。
【讨论】:
以上是关于PHP MySQLi OOP中“->”和“::”的区别的主要内容,如果未能解决你的问题,请参考以下文章
在数据库中获取结果的推荐方法 [OOP-PHP & MySQLi]