call_user_func_array против call_user_func - PullRequest
8 голосов
/ 13 июля 2009

Сегодня я столкнулся с интересной проблемой. У нас есть приложение, которое использует функциональность кэширования Zend Frameworks. Запрос к этому приложению обычно вызывает метод фабрики, используя следующую строку

$result =  call_user_func_array(array("myclass", "factory"), array($id));

Идея состоит в том, чтобы вернуть объект из фабричного метода, к которому мы можем получить доступ позже. Когда мы реализовали функцию кэширования, этот вызов просто умирает. Никаких ошибок, только белый экран. Ничего в журнале ошибок. Мы можем записать строку ошибки до того, как все будет в порядке, но попытка error_log внутри фабричного метода ничего не даст.

Интересно, изменив строку на:

$result =  call_user_func(array("myclass", "factory"), $id);

исправляет проблему.

Мы потратили несколько часов, просматривая сообщения об ошибках, и почти ничего не нашли, чтобы объяснить это поведение. Мысли кто-нибудь?

Ответы [ 3 ]

2 голосов
/ 15 июля 2009

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

$dummy = new MyClassName;
call_user_func_array(array('MyClassName', 'method'), array($id));
unset($dummy);
0 голосов
/ 13 июля 2009

Это сегментация? Проверьте свои корневые журналы apache (вне любого виртуального хоста) и посмотрите, что происходит. Если этот поток является segfaulting, вы можете сохранить это в списках рассылки PHP и / или трекере ошибок.

В качестве альтернативы вы можете попробовать запустить http в однопользовательском режиме, в GDB, с отладкой-компиляцией php и посмотреть, сможете ли вы ее перехватить, но это большая работа: -)

0 голосов
/ 13 июля 2009

Какую версию php вы используете? Возникла проблема в сочетании call_user_func_array с ReflectionClass в одной точке. Я не уверен, что это все еще исправлено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...