可以使用对象运算符 ( ->
) 和类运算符 ( ::
)访问对象或类的成员。
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
)。对于类运算符,情况并非如此,这$
是必要的。对于类中定义的常量,$
从不使用。
另请注意,仅当函数不引用对象var_dump(MyClass::d());
时才允许这样做: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