物件和類操作符

可以使用物件運算子(->)和類運算子(::)訪問物件或類的成員。

class MyClass {
    public $a = 1;
    public static $b = 2;
    const C = 3;
    public function d() { return 4; }
    public static function e() { return 5; }
}

$object = new MyClass();
var_dump($object->a);   // int(1)
var_dump($object::$b);  // int(2)
var_dump($object::C);   // int(3)
var_dump(MyClass::$b);  // int(2)
var_dump(MyClass::C);   // int(3)
var_dump($object->d()); // int(4)
var_dump($object::d()); // int(4)
var_dump(MyClass::e()); // int(5)
$classname = "MyClass";
var_dump($classname::e()); // also works! int(5)

請注意,在物件操作符之後,不應該寫入 $$object->a 而不是 $object->$a)。對於類操作符,情況並非如此,並且 $ 是必需的。對於類中定義的常量,從不使用 $

另請注意,僅當 d() 函式引用物件時才允許 var_dump(MyClass::d());

class MyClass {
    private $a = 1;
    public function d() {
        return $this->a;
    }
}

$object = new MyClass();
var_dump(MyClass::d());   // Error!

這會導致’PHP 致命錯誤:未捕獲錯誤:在不在物件上下文中時使用$ this'

這些運算子具有關聯性,可用於連結

class MyClass {
    private $a = 1;
    
    public function add(int $a) {
        $this->a += $a;
        return $this;
    }
    
    public function get() {
        return $this->a;
    }
}

$object = new MyClass();
var_dump($object->add(4)->get());  // int(5)

這些運算子具有最高優先順序(手冊中甚至沒有提到它們),甚至高於 clone。從而:

class MyClass {
    private $a = 0;
    public function add(int $a) {
        $this->a += $a;
        return $this;
    }
    public function get() {
        return $this->a;
    }
}

$o1 = new MyClass();
$o2 = clone $o1->add(2);
var_dump($o1->get()); // int(2)
var_dump($o2->get()); // int(2)

在克隆物件之前新增 $o1 的值 !

請注意,使用括號來影響優先順序不適用於 PHP 5 及更早版本(在 PHP 7 中):

// using the class MyClass from the previous code
$o1 = new MyClass();
$o2 = (clone $o1)->add(2);  // Error in PHP 5 and before, fine in PHP 7
var_dump($o1->get()); // int(0) in PHP 7
var_dump($o2->get()); // int(2) in PHP 7