我想要一个可以从父类访问但不实例化的类范围变量。
class A {
abstract public static $v;
public function v(){
echo static::$v;
}
}
class B extends A {
$v = 'Hello world';
}
抽象静态或const是完美的,但当然它们不存在,虽然我可以通过抽象函数实现它,但抽象函数也不能是静态的。
一种方法是简单地说:
protected $var = 'const';
然后再也不要改变它。但是,我想要更多的保证,这不必要地为每个类的实例使用一些内存。
有什么能够使这成为可能(并且实用)吗?
我想:
答案 0 :(得分:1)
抽象函数也不是静态的。
根据PHP5"严格标准"他们不应该。 But they sure can.
PHP 7完全没问题。
PHP 5抱怨,但只有在严格标准开启的情况下从未停止过任何人,默认情况下并非如此。
那就是说,使用任何旧的抽象,非静态方法有什么问题吗? 以下代码工作正常。
abstract class A
{
public abstract function actualV();
public function v()
{
echo $this->actualV();
}
}
class B extends A
{
public function actualV()
{
return 'const';
}
}
(new B())->v();
将回复const
。
如果某个课程没有实施actualV
:
致命错误:C类包含1个抽象方法,因此必须声明为抽象方法或实现其余方法(A :: actualV)。
如果您真的想要,可以在static
方法声明前面拍一个actualV
,将$this->v()
更改为static::v()
并禁用严格标准(如果他们& #39;重新开始使用PHP 5)和error_reporting(E_ALL & ~E_STRICT);
,所有内容仍然可以正常运行。