如何在php中访问子类的常量或静态

时间:2016-02-03 19:15:18

标签: php

我想要一个可以从父类访问但不实例化的类范围变量。     

class A {
  abstract public static $v;
  public function v(){
    echo static::$v;
  }
}

class B extends A {
  $v = 'Hello world';
}

抽象静态或const是完美的,但当然它们不存在,虽然我可以通过抽象函数实现它,但抽象函数也不能是静态的。

一种方法是简单地说:

protected $var = 'const';

然后再也不要改变它。但是,我想要更多的保证,这不必要地为每个类的实例使用一些内存。

有什么能够使这成为可能(并且实用)吗?

我想:

  1. 将其声明为抽象,以便我可以强制子类实现它
  2. 将其声明为static或const,使其成为类的属性而不是实例
  3. 以不需要跳过大量实施或使用
  4. 的方式进行

1 个答案:

答案 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);,所有内容仍然可以正常运行。