"Странность" PHP?
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 так делает?
upd:
ага ))) пообсуждали в жабере ))
я забыл про статические функции (в дельфи их вроде как нет), а при изучении си шарпа я про них читал, но на практике не попробовал, поэтому и забыл. ну и в общем вот =)))
Жесть. :eek: как таким языком пользоваться-то можно...
И тут я соглашусь с hardcase'ом... WTF?! и кто дал такое право PHP? :D
PS: Snk, Lone Wolf, ребят, вы так говорите... как будто это логично и правильно...
что произойдёт на строчке #LAST ? почему так? сможет мне кто-нибудь объяснить? :)
Мне не понятно, что тебе не понятно. При вызове a::foo() из экземляра класса b ты получаешь контекст этого экземпляра при котором $this как раз и ссылается на этот экземляр, поэтому и получаем "a::foo() -> b::hello(): Hello world! I'm b!"
Хотя по хорошему интерпретатору следовало бы послать тебе нафиг, ты пытаешься вызвать статический метод foo() и при этом таковым его не объвляешь. Но если разработчики решили не посылать:
При попытке вызова нестатических методов статически выводится предупреждение уровня E_STRICT.
, то им видимо виднее.
Нормально можно.
Это не вопрос правильно/не_правильно. Создатели PHP решили данную ситуацию реализовать так, значит оно так работает. Просто это нужно знать и все тут.
Каждый при желании в любом языке может найти "странности". Ибо зачастую разные люди видят то, как должно быть "правильно" по разному.
Но я не рассуждал, кто прав, а кто нет. Для меня это было странно и казалось неверным (да и сейчас кажется, но это моё имхо). По сему и поднял тему :)
Ничуть. Я не вижу проблемы начать писать на другом языке. Вообще язык это вторично, код в конечном итоге пишет программист и ему нужно просто знать ту или иную особенность языка. А уж особенности у языков есть и всех.
ЗЫ. Меня вообще Erlang впечатляет ;)
Меня он тоже впечатляет.
Но все ж таки меня поразило то, что разрабы языка такой очевидный багодром подсунули. Больше походит на некачественную внутреннюю реализацию стековых фреймов исполняющего движка, возможно как-то связано с поддержкой замыканий (но все это уже фантазии).
имхо, разумнее изначально ставить рамки того, что можно, а что лучше НЕ делать =)
понимая всё мегаудобство подобных финтов, и отсутствия строгой типизации... всё же старательно этого избегаю =) (я в основном использую perl и c/c++, неприятно получается когда пытаешься объявить переменную начиная её с $/%/@ в C++ после perl :D)
вот смотри, поработал со вседозволенностью и встала необходимость перейти на С++ (например! потому что там уж точно всё жестче будет - и типизация, и строгости с классами...) :) вот тогда будет весело :)
но все-таки, если пишеш на ПХП, то не использывать сгубоПХПшные возможности, как минимум глупо. ИМХО
Думаю что если пишешь на определенном языке - нужно просто знать особенности его реализации ))
я забыл про статические функции (в дельфи их вроде как нет)
как нет? class function пишешь и вот оно.
[/offtop]
А поведение интересное. Хотя кто-нибудь может сказать что спецификации языка этого не написано? Кто-нибудь ее читал? :)
как нет? class function пишешь и вот оно.
[/offtop]
старею :D
че это? =))