从PHP5中的抽象方法访问类常量

时间:2010-02-18 13:09:44

标签: php constants abstract-class

我试图获取扩展类的常量值,但是在抽象类的方法中。像这样:

    abstract class Foo {
        public function method() {
            echo self::constant;
        }
    }

    class Bar extends Foo {
        const constant = "I am a constant";
    }

    $bar = new Bar();
    $bar->method();

然而,这会导致致命错误。有没有办法做到这一点?

2 个答案:

答案 0 :(得分:3)

使用PHP 5.3中引入的Late Static Binding关键字可以实现此目的

本质上,self指代编写代码的当前类,而static指代代码运行的类。

我们可以将您的代码段重写为:

abstract class Foo {
    public function method() {
        echo static::constant;    // Note the static keyword here
    }
}

class Bar extends Foo {
    const constant = "I am a constant";
}

$bar = new Bar();
$bar->method();

但是,这种编码模式很脏,您可能应该改为在父类和子类之间引入受保护的api,以来回传递此类信息。

因此,从代码组织的角度来看,我将更倾向于 Morfildur 提出的解决方案。

答案 1 :(得分:2)

这是不可能的。一种可能的解决方案是创建一个在子类中返回所需值的虚方法,即

abstract class Foo {
  protected abstract function getBar();

  public function method() {
    return $this->getBar();
  }
}

class Bar extends Foo {
  protected function getBar() {
    return "bar";
  }
}