为什么在这种情况下需要self :: scope

时间:2011-04-18 16:21:07

标签: php class inheritance

我有一个简单的基类

class base {
  function do_something() {
    $result = helper_function();
  return $result;
}

private function helper_function() {
    return 10;
  }

}

然后我有一个继承自它的主类。

class my_class extends base {
  function __construct() {
    echo parent::do_something();
  }
}

为了实现这一点,我需要在parent::do_something()中指定my_class。我明白了,这很有道理。但是,此代码将引发错误。为了使它工作,我必须指定:

$result = self::helper_function();

对我来说,这没有任何意义。因为它让我修改了基类,如果它没有被继承,它将自己工作。似乎与继承模型相矛盾。

也许我只是做错了。任何见解都将不胜感激!

3 个答案:

答案 0 :(得分:4)

self::前缀通常表示您正在调用父静态方法。如果此函数未在同一个类中声明,但在您继承该方法的类中声明,则应使用parent::。通常未声明为static的特定函数不考虑静态。如果您正在调用普通方法,则应使用$this->代替。

静态和普通方法的主要区别在于:

  • 即使没有提及类
  • ,也可以调用静态方法
  • 必须在之后调用普通方法并创建该类的对象

这样:

class foo {
    public function normal() {}
    public static function static() {}
}

foo::static(); // works
foo::normal() // don't work
$foo = new foo();
$foo->normal(); // works

参考文献:

答案 1 :(得分:3)

您需要使用$this->helper_function()。 这是该类的一种方法,因此您必须使用$this来调用它。 self::使用static静态调用它,除非将函数声明为{{1}},否则不应该这样做。

答案 2 :(得分:2)

你可以这样做:

  function __construct() {
    echo $this->do_something();
  }

$this指的是此类以及父

的任何公共或受保护选项