区别于-&燃气轮机&引用;“和”:&引用;在PHP MySQLi OOP中

区别于-&燃气轮机&引用;“和”:&引用;在PHP MySQLi OOP中,php,mysql,oop,mysqli,Php,Mysql,Oop,Mysqli,有人能说出mysqli->commit和mysqli::commit之间的区别吗 中的头是mysqli::commit,但在示例中,它们使用mysqli->commit,:访问类的函数而不实例化对象。::用于静态方法 ->用于对象的方法(如果您已经有实例)。操作符用于对象属性 :操作符用于类属性。在mysqli->commit中,mysqli是mysqli的一个实例 在mysqli::commit中调用静态方法如果您有一个对象的实例,可以使用->引用该实例中的方法: $foo = new Foo

有人能说出
mysqli->commit
mysqli::commit
之间的区别吗


中的头是
mysqli::commit
,但在示例中,它们使用
mysqli->commit
,:访问类的函数而不实例化对象。

::
用于静态方法


->
用于对象的方法(如果您已经有实例)。

操作符用于对象属性


操作符用于类属性。

在mysqli->commit中,mysqli是mysqli的一个实例
在mysqli::commit中调用静态方法

如果您有一个对象的实例,可以使用->引用该实例中的方法:

$foo = new Foo();
$foo->bar();
Using::调用静态方法而不必创建对象的实例:

Foo::bar();

静态方法不能通过
$this
引用其当前实例,但可以引用自身(当前类)通过使用
self
mysqli->commit是一个公共函数,mysqli::commit是一个静态函数,这两个函数都是mysqli类的php对象符号。

通常在php.net文档中::表示该类具有该方法。对于实际使用,您必须遵循下面的示例,因此使用->sintax。

指定一个静态(类)方法,该方法可以在不实际实例化对象的情况下调用<代码>->指定一个实例(对象)方法,需要实例化一个对象才能使用该方法


例如,如果您有一个变量
$m
,它是类
mysqli
的一个实例,那么您可以通过说
$m->commit()
来调用
commit
,或者您可以通过说
mysqli::commit()
->
在引用对象的成员时使用

是,用于引用类的静态成员

考虑以下类别:

class FooBar {
    public static function fizz() {
        echo "Fizz";
    }

    public function buzz() {
        echo "Buzz";
    }
}
您可以使用
->
调用函数
buzz()

$myFooBar = new FooBar();
$myFooBar->buzz();
但是将使用
调用functon
fizz()
,因为它是一个静态成员(不需要调用类实例的成员):


另外,当我们讨论静态成员与实例化成员之间的区别时,您不能使用
$this
引用静态成员中的当前实例。您可以使用(无前导的
$
)来引用当前类,或者如果您想引用父类,或者如果您喜欢使用PHP5.3.0(允许后期静态绑定)


文档使用
::
引用类中的函数,因为标头中的类名不是该类的实例。仍然使用相同的示例,引用函数
buzz()
的文档条目将使用以下标题:

FooBar::buzz
但是,除非文档指定它是静态成员,否则您需要在实例上使用
->
来调用它:

$myFooBar = new FooBar();
$myFooBar->buzz();

使用范围解析运算符调用非静态成员会在PHP<5.3.0中引发E_STRICT,在PHP>=5.3.0中引发E_警告。并且存在
self
以在静态上下文中引用当前类。它不引用实例,而是引用自身:
class A{static function b(){self::c();}私有静态函数c(){echo'hello';}即将发布,但这是非常正确的。简言之,对约翰的回答没有区别。正如Andrew在PHP手册中所述,将类方法描述为ClassName::methodName是一种惯例,其目的是将is用作对象,即$name->commit(),除非文档中另有说明。这个答案令人惊讶。如何做FooBar::fizz()->选择(“某物”)->在哪里(“某物”);
$myFooBar = new FooBar();
$myFooBar->buzz();