X   Сообщение сайта
(Сообщение закроется через 2 секунды)

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Странное поведение PHP
Гость_wizard993_*
сообщение 2013-04-05, 21:38
Сообщение #1



Гости





Собственно я уже ничего не понимаю.

Вот написал такой код:


<?php
abstract class Base
{
	public function __call($n,array$p)
	{
		echo __METHOD__.' says: '.$n;
	}
}

class Main extends Base
{
	public function __construct()
	{
		self::Launch();
	}
}

$M=new Main;
?>


Кто-нибудь подскажет, почему вызывается метод Base::__call() ? Что вообще происходит. почему это вообще возможно?)
Нашёл что-то подомное в приписках к мануалу: self и this
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-04-05, 22:51
Сообщение #2
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 260
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


wizard993, ну все правильно. Ведь класс Main наследует класс Base, а значит и все его методы. И небольшой вам совет: пишите что ожидаете и что получаете.
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-04-05, 22:55
Сообщение #3



Гости





Цитата (Alexander @ 2013-04-05, 22:51)
пишите что ожидаете и что получаете.

ожидаю, что должен вызываться __callStatic(). а почему __call() вызывается понять не могу
Почему вообще self работает внутри динамических методов? какое значение он принимает - имя класса в контексте вызова?


Сообщение отредактировал wizard993 - 2013-04-05, 22:56
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-04-06, 0:34
Сообщение #4
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 260
Регистрация: 2008-11-11
Из: Николаев
Версия системы: RC5

Репутация:   нет  
Всего: 67


wizard993, а почему вдруг self не должен работать внутри динамических методов? Как тогда вызывать статических методы из динамических? :)

Цитата (wizard993 @ 2019-12-11 14:34)
ожидаю, что должен вызываться __callStatic()

Что-то я не вижу у вас в коде __callStatic() . Вот и вызывает php у вас метод call.
Перейти в начало страницы
+Цитировать сообщение
Гость_wizard993_*
сообщение 2013-04-06, 9:09
Сообщение #5



Гости





Цитата (Alexander @ 2013-04-06, 0:34)
Как тогда вызывать статических методы из динамических? :)

Всё-всё-всё этот момент я понял. Вчера сидел, размышлял. Спасибо большое :)

Цитата (Alexander @ 2013-04-06, 0:34)
Что-то я не вижу у вас в коде __callStatic() . Вот и вызывает php у вас метод call.

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 260
Регистрация: 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



Гости





Цитата (Alexander @ 2013-04-06, 18:53)
Попробуйте запостить сию информацию в ихний багтрекер. Могу сделать это за вас.

Если вас не затруднит отправьте им репорт. Мне кажется, у вас лучше получится обозначить проблему

Цитата
Почитал я багтрекер. Там таких проблем валом, но их не спешат исправлять. Вот, что нашел:
https://bugs.php.net/bug.php?id=51176


Спасибо.... фигово, конечно, что ещё сказать...

Сообщение отредактировал wizard993 - 2013-04-06, 19:22
Перейти в начало страницы
+Цитировать сообщение
Alexander
сообщение 2013-04-06, 19:18
Сообщение #8
Eleanor developer
Иконка группы

Группа: Администраторы
Сообщений: 5 260
Регистрация: 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



Гости





Цитата (Alexander @ 2013-04-06, 19:18)
Статус этой ошибки "Not a bug"


Как всегда, философия php: если вы находите баг, то это не баг, а фича :)
Перейти в начало страницы
+Цитировать сообщение

Ответить в данную темуНачать новую тему
0 чел. читают эту тему (гостей: 0, скрытых пользователей: 0)
Пользователей: 0

 
RSS Текстовая версия 0.0471 сек.    12 запросов    GZIP включен    Сейчас: 2019-12-11, 13:34