访问方法的不同方式


Different ways to access methods

我已经看到有两种不同的方法来访问类中的方法。行为上是否存在任何差异,或者它们纯粹是同一操作的替代语法?

$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()用于实例方法。