Помощник
Здравствуйте, гость ( Вход | Регистрация )
Странное поведение PHP |
Гость_wizard993_* |
2013-04-05, 21:38
Сообщение
#1
|
|
Гости |
Собственно я уже ничего не понимаю.
Вот написал такой код:
Кто-нибудь подскажет, почему вызывается метод Base::__call() ? Что вообще происходит. почему это вообще возможно?) Нашёл что-то подомное в приписках к мануалу: self и this |
|
|
||
Alexander |
2013-04-05, 22:51
Сообщение
#2
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
wizard993, ну все правильно. Ведь класс Main наследует класс Base, а значит и все его методы. И небольшой вам совет: пишите что ожидаете и что получаете.
|
|
|
||
Гость_wizard993_* |
2013-04-05, 22:55
Сообщение
#3
|
|
Гости |
ожидаю, что должен вызываться __callStatic(). а почему __call() вызывается понять не могу Почему вообще self работает внутри динамических методов? какое значение он принимает - имя класса в контексте вызова? Сообщение отредактировал wizard993 - 2013-04-05, 22:56 |
|
|
||
Alexander |
2013-04-06, 0:34
Сообщение
#4
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
wizard993, а почему вдруг self не должен работать внутри динамических методов? Как тогда вызывать статических методы из динамических?
Что-то я не вижу у вас в коде __callStatic() . Вот и вызывает php у вас метод call. |
|
|
||
Гость_wizard993_* |
2013-04-06, 9:09
Сообщение
#5
|
|
Гости |
Всё-всё-всё этот момент я понял. Вчера сидел, размышлял. Спасибо большое 1. Где регламентируется такое поведение, что если в статическом контексте вызывают несуществующий метод, а __callStatic() не существует, то перебрасываем обращение в __call()? Кстати добавил в код __callStatic() - игнорируется он. Всё равно идёт вызов в __call() 2. Это раньше когда не было __callStatic() вызов несуществующего метода из любого контекста обращался в __call(). 3. Тут, похоже, дело в другом. Я пошёл в мануал почитать ещё раз о перегрузке __call и callStatic(). Вот выдержка: Цитата public mixed __call ( string $name , array $arguments ) public static mixed __callStatic ( string $name , array $arguments ) В контексте объекта при вызове недоступных методов вызывается метод __call(). В статическом контексте при вызове недоступных методов вызывается метод __callStatic(). Прошу мне объяснить тогда, что такое статический контекст. И почему в выше приведённом коде self::Launch(); не является в статическом контекстом? Пока в голову приходит только мысль, что раз вызов self::Launch(); осуществляется из контекста объекта, то каким образом мы вызываем метод - нам неважно, контекст так и будет контекстом объекта. Но я не видел нигде пояснений такого поведения. Сообщение отредактировал wizard993 - 2013-04-06, 9:10 |
|
|
||
Alexander |
2013-04-06, 18:53
Сообщение
#6
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
Почитал я багтрекер. Там таких проблем валом, но их не спешат исправлять. Вот, что нашел:
https://bugs.php.net/bug.php?id=51176 Сообщение отредактировал Alexander - 2013-04-06, 19:13 |
|
|
||
Гость_wizard993_* |
2013-04-06, 19:13
Сообщение
#7
|
|
Гости |
Если вас не затруднит отправьте им репорт. Мне кажется, у вас лучше получится обозначить проблему Цитата Почитал я багтрекер. Там таких проблем валом, но их не спешат исправлять. Вот, что нашел: https://bugs.php.net/bug.php?id=51176 Спасибо.... фигово, конечно, что ещё сказать... Сообщение отредактировал wizard993 - 2013-04-06, 19:22 |
|
|
||
Alexander |
2013-04-06, 19:18
Сообщение
#8
|
|
Eleanor developer Группа: Администраторы Сообщений: 5 262 Регистрация: 2008-11-11 Из: Николаев Версия системы: RC5 Репутация: нет Всего: 67 |
wizard993, поправил я свой пост, т.к. нашел много подобных багов в багтрекере PHP . Статус этой ошибки "Not a bug", тоесть это не является багом, а вот и пояснение:
Цитата This is ridiculous- this bug is not bogus, it's completely legitimate, unexpected behavior, and totally non documented. As a reasonable programmer, one expects a static call to behave the same inside of a class as well as outside of a class. How can we bring the "desired" behavior up for vote? I think that it's insane to not fix it. |
|
|
||
Гость_wizard993_* |
2013-04-06, 19:25
Сообщение
#9
|
|
Гости |
Как всегда, философия php: если вы находите баг, то это не баг, а фича |
|
|
||
Текстовая версия | 0.0377 сек. 12 запросов GZIP включен Сейчас: 2024-09-26, 13:49 |