我已经看到有两种不同的方法来访问类中的方法。行为上是否存在任何差异,或者它们纯粹是同一操作的替代语法?
$a = new A();
$a->foo();
A::foo();
你不能只使用其中一个。 ::
用于静态方法和变量,而->
用于实例方法和变量。这是从C++语法中"启发"的。
class A {
public function __construct() {}
public function foo() {}
}
$a = new A();
$a->foo();
// Or use the shorter "new A()->foo()";
// It won't return typeof(A), it will return what foo() returns.
// The object will still be created, but the GC should delete the object
或
class A {
public static function foo() {}
}
A::foo();
根据DCoder的说法,::
可用于调用父方法,但我不确定这一点。
class B {
public function __construct() {}
public function foo() {}
}
class A extends B {
public function __construct() {
// Code
parent::__construct()
}
public function foo() {
// Code
parent::foo()
}
}
当你这样做时
$a = new A();
您有一个名为 A 的对象类的实例。
这意味着你有一个特定的对象(有自己的个性,他的属性中的具体价值)。
因此,您可以使用如下表达式访问此对象的属性和调用方法:
$a->foo();
另一方面
A::foo();
是访问驻留在类本身的属性和方法(在类的定义中)的正确方法。这些称为静态。
主要区别在于可以在创建该类的任何对象之前访问静态方法,即无需使用 new
运算符。它们用于跨对象属性和对象范围的方法。
对象的实例(使用 new
运算符创建)是类的真实副本,可以对其属性具有不同的值。对于相同的属性,同一类的两个对象内部可以具有不同的值。在类的静态部分,所有对象将具有相同的值和行为。
希望有帮助!
>->
将访问从类 A 实例化的特定对象的方法。
::
是范围解析运算符,它引用指定类的静态成员(在您的案例中是类 A)。
如果您没有注意到->
您可以访问从类 A 创建的对象的$a
方法($a = new A();
),但通过::
您可以访问静态方法(静态方法不需要访问对象)。
例如。
假设你有一个名为 Math
的类,它有一个静态方法Add()
:
<?php
class Math{
// Note the 'static' keyword
public static function Add($arg1, $arg2){
return $arg1+$arg2;
}
}
?>
在这种情况下,您可以直接使用 Add()
方法,而无需创建任何类 Math
对象,如下所示:
<?php
print Math::Add(2, 3);
?>
您可以使用::
符号访问Math
类的静态方法。使用->
符号是没有意义的,因为它用于访问从类创建的对象的方法。
所以:
<?php
class Math{
// Add() NO LONGER static
public function Add($arg1, $arg2){
return $arg1+$arg2;
}
}
?>
你必须这样做:
<?php
$object = new Math();
$result = $object->Add(2, 3);
print $result;
?>
: 运算符静态访问类。在这种情况下,没有作为对象的类实例。它在不同的OOP设计模式(如Singleton和Factory方法)中都有它的用途。访问此内容的范围几乎是全球性的,如果您不知道自己在做什么,可能会给您带来麻烦。
使用 -> 运算符意味着您正在访问实例化类的方法或变量。在这种情况下,作用域位于您实例化的特定对象内,并删除该全局状态。
foo()
是静态方法,您将使用class::foo()
访问foo()
方法。否则,您将object->foo()
用于实例方法。