Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

"Странность" PHP?

92
01 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
Код:
class a {
    function hello() {
        print "a::hello(): Hello world! I'm a!<br /><br />";
    }

    function foo() {
        print "a::foo() -> ";
        $this->hello();
    }
};

$a = new a();
$a->foo(); // Hello world! I'm a!

class b {
    function hello() {
        print "b::hello(): Hello world! I'm b!<br /><br />";
    }

    function foo() {
        print "b::foo() -> ";
        a::foo();
    }
}
$b = new b();
$b->foo(); // #LAST


что произойдёт на строчке #LAST ? почему так? сможет мне кто-нибудь объяснить? :)

PS: вопрос без подвоха и издёвок, просто реально интересно, почему PHP так делает?
6
01 июля 2009 года
George
4.1K / / 05.01.2007
я не совсем в теме пхпшного ООП, но когда ты в функции "b::foo" пишешь "a:foo" - это как называется? какая то странная фича... ты вызываешь метод класса "a", не создав экземпляра класса. или не так?

upd:
ага ))) пообсуждали в жабере ))
я забыл про статические функции (в дельфи их вроде как нет), а при изучении си шарпа я про них читал, но на практике не попробовал, поэтому и забыл. ну и в общем вот =)))
14K
01 июля 2009 года
Snk
54 / / 22.03.2007
Он наверно копирует ф-ию foo a класса в b класс, а не ссылается на нее... это тоже самое что заменить ' a::foo(); ' на ' print "a::foo() -> "; $this->hello(); ' то есть объект не создается и this указывает на b класс... если писать не "$this->hello();", а "a::hello();" тогда будет все ок...
274
01 июля 2009 года
Lone Wolf
1.3K / / 26.11.2006
Ты статически вызываешь ф-кую foo класса a (a:foo). Естественно this-> как-бы не существует и должна была бы быть ошибка, но так как вызвана она из созданого класса b, то там уже сущетсвует только одина ссылка на контекст $this которая указывает на обьект b, то из общего пула выбирается именно она. Вот вроде так :)
5
01 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: Lone Wolf
Ты статически вызываешь ф-кую foo класса a (a:foo). Естественно this-> как-бы не существует и должна была бы быть ошибка, но так как вызвана она из созданого класса b, то там уже сущетсвует только одина ссылка на контекст $this которая указывает на обьект b, то из общего пула выбирается именно она. Вот вроде так :)

Жесть. :eek: как таким языком пользоваться-то можно...

92
01 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
Вот именно, класс B подменяет $this в ф-и класса A. Ни один из языков, с которыми я знаком, не позволит использовать внутренний указатель на объект класса, в статической ф-и (точнее, не даст (ибо нельзя!) вызывать не статическую функцию статически).

И тут я соглашусь с hardcase'ом... WTF?! и кто дал такое право PHP? :D

PS: Snk, Lone Wolf, ребят, вы так говорите... как будто это логично и правильно...
12
01 июля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Тень Пса

что произойдёт на строчке #LAST ? почему так? сможет мне кто-нибудь объяснить? :)


Мне не понятно, что тебе не понятно. При вызове a::foo() из экземляра класса b ты получаешь контекст этого экземпляра при котором $this как раз и ссылается на этот экземляр, поэтому и получаем "a::foo() -> b::hello(): Hello world! I'm b!"

Хотя по хорошему интерпретатору следовало бы послать тебе нафиг, ты пытаешься вызвать статический метод foo() и при этом таковым его не объвляешь. Но если разработчики решили не посылать:

Цитата:

При попытке вызова нестатических методов статически выводится предупреждение уровня E_STRICT.


, то им видимо виднее.

92
01 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
alekciy, просто странно для меня это, и кажется мне совсем неправильным :(
12
01 июля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: hardcase
Жесть. :eek: как таким языком пользоваться-то можно...


Нормально можно.

12
01 июля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Тень Пса
alekciy, просто странно для меня это, и кажется мне совсем неправильным :(


Это не вопрос правильно/не_правильно. Создатели PHP решили данную ситуацию реализовать так, значит оно так работает. Просто это нужно знать и все тут.

Каждый при желании в любом языке может найти "странности". Ибо зачастую разные люди видят то, как должно быть "правильно" по разному.

274
01 июля 2009 года
Lone Wolf
1.3K / / 26.11.2006
может и не правильно, но все-таки иногда бывают полезны такие финты ушами.
12
01 июля 2009 года
alekciy
3.0K / / 13.12.2005
Это как с типизацией. В одних языках решили, что строга типизация есть хорошо, создатели других решили что это плохо. И каждая из стором может привести доводы почему именно они выбрали этот путь. И что, кто прав? ;)
92
01 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
ну, alekciy, ты канеш ярый защитник ПХП :) убедил, что "пусть каждый делает так как ему вздумается" :)) (собссна тебя и ждал в этой теме, спасибо, что заглянул ;))

Но я не рассуждал, кто прав, а кто нет. Для меня это было странно и казалось неверным (да и сейчас кажется, но это моё имхо). По сему и поднял тему :)
274
01 июля 2009 года
Lone Wolf
1.3K / / 26.11.2006
тут скорее дело привычки. поработаешь некоторое время с пхп, с его вседовзволеностью и будешь матреить другие языки за то, чтол они все запрещают и т.д
12
01 июля 2009 года
alekciy
3.0K / / 13.12.2005
Цитата: Тень Пса
ну, alekciy, ты канеш ярый защитник ПХП :)


Ничуть. Я не вижу проблемы начать писать на другом языке. Вообще язык это вторично, код в конечном итоге пишет программист и ему нужно просто знать ту или иную особенность языка. А уж особенности у языков есть и всех.

ЗЫ. Меня вообще Erlang впечатляет ;)

5
01 июля 2009 года
hardcase
4.5K / / 09.08.2005
Цитата: alekciy
ЗЫ. Меня вообще Erlang впечатляет ;)

Меня он тоже впечатляет.

Но все ж таки меня поразило то, что разрабы языка такой очевидный багодром подсунули. Больше походит на некачественную внутреннюю реализацию стековых фреймов исполняющего движка, возможно как-то связано с поддержкой замыканий (но все это уже фантазии).

92
01 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
Цитата: Lone Wolf
тут скорее дело привычки. поработаешь некоторое время с пхп, с его вседовзволеностью и будешь матреить другие языки за то, чтол они все запрещают и т.д


имхо, разумнее изначально ставить рамки того, что можно, а что лучше НЕ делать =)

понимая всё мегаудобство подобных финтов, и отсутствия строгой типизации... всё же старательно этого избегаю =) (я в основном использую perl и c/c++, неприятно получается когда пытаешься объявить переменную начиная её с $/%/@ в C++ после perl :D)

вот смотри, поработал со вседозволенностью и встала необходимость перейти на С++ (например! потому что там уж точно всё жестче будет - и типизация, и строгости с классами...) :) вот тогда будет весело :)

274
01 июля 2009 года
Lone Wolf
1.3K / / 26.11.2006
согласен на все 150%
но все-таки, если пишеш на ПХП, то не использывать сгубоПХПшные возможности, как минимум глупо. ИМХО
304
02 июля 2009 года
Fenyx
707 / / 26.01.2005
Ну скажем что на этом не заканчиваются различия, в С если не указанно все методы приват, в пхп паблик, например
Думаю что если пишешь на определенном языке - нужно просто знать особенности его реализации ))
92
02 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
я говорил совсем не о различиях ;) я говорил именно о том, что для меня это странно и (imho!) не верно. да и по теме уже разобрались вроде бы )
14
02 июля 2009 года
Phodopus
3.3K / / 19.06.2008
[offtop]
Цитата: Washington

я забыл про статические функции (в дельфи их вроде как нет)


как нет? class function пишешь и вот оно.
[/offtop]
А поведение интересное. Хотя кто-нибудь может сказать что спецификации языка этого не написано? Кто-нибудь ее читал? :)

92
02 июля 2009 года
Тень Пса
2.2K / / 19.10.2006
на почитай =) отсюда alekciy и привёл цитату

http://www.php.net/manual/ru/language.oop5.static.php
6
02 июля 2009 года
George
4.1K / / 05.01.2007
Цитата: Phodopus
[offtop]
как нет? class function пишешь и вот оно.
[/offtop]


старею :D
че это? =))

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог