我已经看到有两种不同的方法可以访问类中的方法。行为是否有任何差异,或者它们是否纯粹是同一操作的替代语法?
$a = new A();
$a->foo();
A::foo();
我已经看到有两种不同的方法可以访问类中的方法。行为是否有任何差异,或者它们是否纯粹是同一操作的替代语法?
$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();
是访问驻留在类本身(在类的定义中)的属性和方法的正确方法。这些被称为static。
主要区别在于静态方法可以在创建该类的任何对象之前访问,即无需使用new
运算符。它们用于跨对象属性和对象范围的方法。
对象的实例(使用new
运算符创建)是类的真实副本,它们的属性可以具有不同的值。对于相同的属性,同一类的两个对象可以在其中具有不同的值。在类的静态部分中,所有对象都将具有相同的值和行为。
希望有帮助!
->
将访问从类 A 实例化的特定对象的方法。
::
是范围解析运算符,它引用指定类的静态成员(在您的情况下为类 A )。
如果您没有注意到WAS从类 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;
?>
如果是静态方法,您将访问foo()
方法。否则,您将使用实例方法。class::foo()
foo()
object->foo()
使用::运算符静态访问类。在这种情况下,没有类的实例作为对象。它用于不同的 OOP 设计模式,例如 Singleton 和 Factory 方法。访问它的范围几乎是全球性的,如果您不知道自己在做什么,可能会给您带来麻烦。
-> 运算符的使用意味着您正在访问实例化类的方法或变量。在这种情况下,范围在您实例化的特定对象内,并删除了该全局状态。