Почему в этой ситуации требуется self :: scope - PullRequest
2 голосов
/ 18 апреля 2011

у меня простой базовый класс

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 ]

4 голосов
/ 18 апреля 2011

Префикс self:: обычно означает, что вы вызываете родительский статический метод.Если эта функция не объявлена ​​в том же классе, но в классе, от которого вы наследуете этот метод, тогда вы должны использовать parent::.Обычно функции, не определенные как объявленные как static, не должны рассматриваться как статические.Если вы вызываете обычный метод, вы должны использовать $this->.

Основное различие между статическим и обычным методом заключается в том, что:

  • Статический метод можно вызывать даже без запускаclass
  • После этого должен быть вызван нормальный метод и создан объект этого класса

, так что:

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

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

Ссылки:

3 голосов
/ 18 апреля 2011

Вам нужно использовать $this->helper_function(). Это метод класса, поэтому вы должны вызывать его, используя $this. С self:: вы вызываете это статически, чего не следует делать, если функция не объявлена ​​как static.

2 голосов
/ 18 апреля 2011

вы можете сделать это:

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

$this относится к этому классу и любым из открытых или защищенных опций родителя

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...