PHP MySQLi OOP中“->”和“::”的区别

Posted

技术标签:

【中文标题】PHP MySQLi OOP中“->”和“::”的区别【英文标题】:Difference between "->" and "::" in PHP MySQLi OOP 【发布时间】:2010-11-17 17:22:05 【问题描述】:

谁能分辨mysqli->commitmysqli::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]

将 $mysqli 设置为 OOP 的全局变量

面向OOP类的PHP MySQLI面向对象查询,不将查询响应计为对象[重复]

计算 OOP PHP 中返回的行数

通过PHP中的OOP连接到数据库和活动

MySQLi OOP 绑定参数错误