我已经看到有两种不同的方法来访问类中的方法。行为是否存在差异,或者它们是同一行为的纯粹替代语法?
$a = new A();
$a->foo();
A::foo();
答案 0 :(得分:6)
你不能只使用其中一个。 ::
用于静态方法和变量,而->
用于方法和变量。这是从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()
}
}
答案 1 :(得分:2)
当你这样做时
$a = new A();
您有一个名为A的对象类的实例。
这意味着你有一个特定的对象(具有自己的个性,属性中的具体值)。
因此,您可以使用以下表达式访问属性并调用此对象的方法:
$a->foo();
另一方面,
A::foo();
是访问驻留在类本身上的属性和方法的正确方法(在类的定义中)。这些被称为静态。
主要区别在于可以在创建该类的任何对象之前访问静态方法,即不需要使用new
运算符。它们用于交叉对象属性和对象范围的方法。
对象的实例(使用new
运算符创建)是类的真实副本,它们的属性可以具有不同的值。对于相同的属性,同一类的两个对象可以在其中具有不同的值。在类的 static 部分中,所有对象都具有相同的值和行为。
希望有所帮助!
答案 2 :(得分:1)
->
将访问从A类实例化的特定对象的方法。
::
是范围解析运算符,它引用指定类的静态成员(在您的案例类A中)。
如果您没有注意到->
,则可以访问从A类($a
)创建 WAS 的对象$a = new A();
的方法,但{ {1}}您访问静态方法(静态方法不需要访问对象)。
例如。
假设您有一个名为::
的类,它具有静态方法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;
}
}
?>
答案 3 :(得分:0)
如果foo()
是静态方法,您将使用class::foo()
访问foo()
方法。否则,您将使用object->foo()
作为实例方法。
答案 4 :(得分:0)
使用 :: 运算符静态访问该类。在这种情况下,没有类的实例作为对象。它具有不同的OOP设计模式,如Singleton和Factory方法。访问它的范围是几乎全局,如果您不知道自己在做什么,可能会让您遇到麻烦。
使用 - &gt;运算符意味着您正在访问实例化类的方法或变量。在这种情况下,范围位于您实例化的特定对象中,并删除全局状态。