我想这样做:
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
成员。所以,遗憾的是,我无法在A::$var
内使用f
。
有没有人知道是否有单表达式语法来执行此操作,使用PHP 5.3 +?
答案 0 :(得分:0)
您将A的实例传递给B,但$ var是A的静态成员,只能使用:: like A :: $ var。
进行访问。private function f() {
echo A::$var;
}
编辑: 如果你想让它依赖于存储在$ a中的实例,你可以做类似的事情:
public function f() {
$class = get_class($this->a);
echo $class::$var;
}
答案 1 :(得分:0)
我看到的第一件事是你不能调用f(),因为它是私有的。
$b->f();
那么也许你可以转向这样的事情?
class B extends A{
private $a;
public function __construct($a) {
$this->a = $a;
}
public function f() {
echo static::$var;
}
}
答案 2 :(得分:0)
以下内容可行,但我会问你为什么要这样做:
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-&gt; a来做任何事情,因为$ var对于类是静态的。
答案 3 :(得分:0)
您可以编写如下函数:
function get_static_property($class, $property) {
return $class::$$property;
}
我不禁想知道你为什么需要这个。有什么理由你不能拥有A实现接口?还是用一个特质?
这样你就可以回复$this->a->someMethodName()
。
PS。返回字符串通常比回显内部方法更受欢迎。