$ this в php связан динамически, верно? - PullRequest
0 голосов
/ 29 мая 2011

Я получаю ошибку, которую я думаю , потому что я допустил какую-то ошибку в рефакторинге, но я не могу найти документацию о том, когда $this связан, и моя ошибка можно объяснить статической связью.

Дополнительные баллы (на самом деле я не могу дать вам дополнительные баллы) за ссылки на отличную документацию о подобных вещах в php.

[Изменить] Ошибка, которую я получаю, говорит мне, что Subclass::$var не существует, когда я, например, echo $this->var в суперклассе. Тем не менее, $var существует в подклассе.

Ответы [ 3 ]

1 голос
/ 29 мая 2011

$this становится доступным после вызова конструктора. Логически вы не можете использовать $this в функции static.

Помимо вызова $this в функции static, не так много всего, что может пойти не так по времени, поскольку в PHP просто нет пути.

Какую именно ошибку вы получаете? Код тоже будет полезен.

0 голосов
/ 29 мая 2011

Это работает в PHP:

class A {
    public function foo() {
        echo $this->bar;
    }
}

class B extends A {
    public $bar = 1;
}

$b = new B;
$b->foo();  // 1

Это работает из-за динамического разрешения области, которое имеет PHP (то есть: область действия разрешается во время выполнения, а не во время компиляции). Тем не менее, я бы рекомендовал против этого, потому что это действительно особенность языка для одного. Во-вторых, отказ объявить $bar в подклассе приведет к ошибке. Я думаю, что класс должен ссылаться только на тех членов, о которых ему известно.

Тот же код, скажем, на C ++:

class A {

public:
    void foo() {
        std::cout << bar;
    }

};

class B : public A {

public:
    int bar;
    B() {
        bar = 1;
    }

};

... выдаст ошибку компиляции ( В A :: foo (): 'bar' не был объявлен в этой области ).

0 голосов
/ 29 мая 2011

Да, $this связывается динамически, о чем свидетельствует тот факт, что на выходе выдается «foo»:

<?php
class Base
{
    public function ecc(){
        echo $this->subvar;
    }
}

class Sub extends Base
{
    public $subvar;
    public function __construct(){
        $this->subvar = 'foo';
        $this->ecc();
    }
}
new Sub();
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...