访问方法的方法不同

时间:2012-05-28 18:07:40

标签: php oop scope-resolution

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

$a = new A();
$a->foo();

A::foo();

5 个答案:

答案 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;运算符意味着您正在访问实例化类的方法或变量。在这种情况下,范围位于您实例化的特定对象中,并删除全局状态。