parent :: в экземплярах классов - PullRequest
3 голосов
/ 10 января 2010

Мне было интересно, почему в php нет синтаксиса $parent->function();, но вместо этого мы можем использовать parent::function();, который выглядит так, как будто он используется внутри статического класса. Я пропускаю некоторые основы PHP?

Ответы [ 3 ]

2 голосов
/ 10 января 2010

Я признаю, что это кажется странным - и вы ничего не пропустили в руководстве ^^

Но:

  • Как правило, когда дочерний класс переопределяет метод, который уже определен в родительском классе, вы хотите, чтобы дочерний метод полностью переопределил родительский метод
    • за исключением __construct, я признаю - возможно, поэтому в руководстве прямо сказано, что вы должны сами вызывать метод __construct родителя.
  • Вообще говоря, при работе с нестатическими методами вы просто будете использовать $this для вызова методов в одном и том же экземпляре дочернего или родительского класса; не нужно знать, где этот метод на самом деле.
  • Использование parent:: работает нормально, даже если выглядит как статический вызов


И вот пример кода, показывающего, что parent:: работает нормально:

class Father {
    public function method() {
        var_dump($this->a);
    }
}

class Son extends Father {
    protected $a;
    public function method() {
        $this->a = 10;
        parent::method();
    }
}

$obj = new Son();
$obj->method();


Вы получите этот вывод:

$ /usr/local/php-5.3/bin/php temp.php
int(10)

Что показывает, что метод в родительском классе имеет доступ к $this и свойствам, определенным в дочернем классе.

2 голосов
/ 10 января 2010

Ну, parent на самом деле ссылается на статический родительский класс - нет оснований предполагать, что существует экземпляр $parent только потому, что существует $child, и даже если бы он был, $child не имел бы доступа до $parent.

Наконец, случай, когда обычные class dog extends animal ООП объяснения не работают! :)

1 голос
/ 10 января 2010

Поскольку использование $parent предполагает, что вы действительно создали экземпляр родительского класса.

Если ваш синтаксис предлагает сработать, это будет означать, что каждый раз, когда вы создаете экземпляр одного объекта, вы создаете экземпляр 2 или более объектов.

В PHP каждая переменная должна содержать строку, целое число (или другой числовой формат), массив, объект или ресурс. $this содержит объект, и это просто тот объект, внутри которого вы сейчас находитесь.

Чтобы создать $parent, вам нужно поместить объект внутрь $parent. Ваш родительский класс технически не создан, поэтому его нельзя присвоить переменной.

Кстати parent::function(); имеет доступ ко всем $this.

Следовательно, это работает

class Test
{
    public function test()
    {
        echo $this->testing_var;
    }
}

class OtherTest
{
    public function run()
    {
        $this->testing_var = "hi";
        Test::test(); // echos hi
    }
}

И это приведет к ошибке, если оно используется вне класса, и скажет вам, что оно должно быть объявлено как статическое.

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