我想这样做:
class A {
public static $var = 'foo';
}
class B {
private $a;
public function __construct($a) {
$this->a = $a;
}
public function f() {
echo $this->a::$var; // <---- ERROR
echo get_class($this->a)::$var; // <---- ERROR
// WORKING but awful
$a = $this->a;
echo $a::$var;
}
}
$b = new B(new A());
$b->f();
请注意,我不知道$a
是A
还是另一个类的实例,我只知道它有一个静态$var
成员。所以,不幸的是,我不能在f
里面使用A::$var
。
有谁知道是否有使用PHP 5.3+的单表达式语法来做到这一点?
您正在将 A 的实例传递到 B 中,但$var是 A 的静态成员,只能使用 :: 如 A::$var 访问。
private function f() {
echo A::$var;
}
编辑:如果要使其依赖于存储在$a中的实例,则可以执行以下操作:
public function f() {
$class = get_class($this->a);
echo $class::$var;
}
我看到的第一件事是你不能调用 f(),因为它是私有的。
$b->f();
那么也许你可以转向这样的东西?
class B extends A{
private $a;
public function __construct($a) {
$this->a = $a;
}
public function f() {
echo static::$var;
}
}
以下内容将起作用,但我质疑你为什么要这样做:
class A {
public static $var = 'foo';
}
class B {
private $a;
public function __construct($a) {
$this->a = $a;
}
public function f() {
if ($this->a instanceof A) {
echo A::$var;
}
}
}
$b = new B(new A());
$b->f();
您不需要专门对 $this->a 执行任何操作,因为$var对类来说是静态的。
你可以写一个这样的函数:
function get_static_property($class, $property) {
return $class::$$property;
}
我不禁想知道你为什么需要这个。为什么你不能让 A 实现接口?还是使用特质?这样你就可以回声$this->a->someMethodName()
.
返回字符串通常比在方法内部回显更受欢迎。