PHP: Как переменная $this внутри одного класса может быть объектом другого?

Вот пример:

class Test {

    public function TestMethod() {

        print_r($this); // Gives me "Test1 Object ( )"

    }
}

class Test1 {

    public function Test1Method() {

        Test::TestMethod();

    }
}

$test1 = new Test1;
$test1->Test1Method();

Я нахожу это странным. Кто-нибудь может объяснить мне, почему это происходит?


person foreline    schedule 21.01.2011    source источник
comment
Я задал очень похожий (не обман) вопрос. Ответы были очень полезными: статический метод из класса b, который расширяет класс a класса a"> stackoverflow.com/questions/516355/   -  person Mike B    schedule 21.01.2011


Ответы (3)


Из http://www.php.net/manual/en/language.oop5.basic.php:

Псевдопеременная $this доступна, когда метод вызывается из контекста объекта. $this — это ссылка на вызывающий объект (обычно объект, которому принадлежит метод, но возможно и другой объект, если метод вызывается статически из контекста вторичного объекта).

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

person Oliver Charlesworth    schedule 21.01.2011
comment
Было бы логично, если бы Test1 был подклассом Test; может быть, это просто дешевый способ воссоздать this поведение, характерное для языков, которые с самого начала были разработаны для ООП. - person tdammers; 21.01.2011
comment
Как лучше всего проверить, ссылается ли $this на текущий класс? Мне нужно, чтобы проверить, был ли метод вызван статически или из объекта. Я думаю, это что-то вроде if ( $this instanceof __CLASS__ ) {}. Я прав? - person foreline; 21.01.2011
comment
@SaltLake: я не знаю. Но лично я бы включил E_STRICT для предотвращения подобных хакерских атак! Это может привести только к боли в долгосрочной перспективе. - person Oliver Charlesworth; 21.01.2011

Краткий ответ: вы вызываете «нестатический» метод, используя вызов статической функции, затем php пытается найти «$ this», а последний реальный «$ this» был в Test1.

Если вы включите отчеты об ошибках E_STRICT, он будет жаловаться на это.

person edorian    schedule 21.01.2011

Является ли поздним статическим связыванием, если я не ошибочно, что может быть, как в конце пятницы.

person Elzo Valugi    schedule 21.01.2011