Назад | Перейти на главную страницу

Инициировать класс PHP, в котором имя класса является переменной

Мне нужна помощь с ошибкой, с которой я раньше не сталкивался и нигде не могу найти.

В рамках PHP mvc (только из учебника) у меня есть следующее:

// Initiate the class
$className = 'Controller_' . ucfirst($controller);
if (class_exists($className)) {
 $controller = new $className($this->registry);
}

$ className показывает правильное имя класса (регистр также правильный). Но когда я запускаю его, я получаю это в журнале ошибок apache (без ошибки php)

[Wed Mar 31 10:34:12 2010] [notice] child pid 987 exit signal Segmentation fault (11)

Идентификатор процесса отличается при каждом вызове. Я использую PHP 5.3.0 на os x 10.6. Этот сайт работает с 5.2.11 на другом Mac. Не совсем уверен, куда идти дальше, чтобы отладить его. Я предполагаю, что это может быть настройка apache, а также ошибка php или проблема с кодом ... какие-либо предложения о том, где искать дальше?

Ошибка не появляется при комментировании этого кода. У меня также есть около 15 других php-сайтов, работающих без проблем. Включение других, использующих ту же базовую структуру mvc

Я помню, что у меня была такая же проблема. Если я правильно помню, проблема заключалась в рекурсивном создании экземпляра, то есть PHP исчерпал память, что вызвало ошибку сегментации. Убедитесь, что создание экземпляра $ className не происходит по кругу.

Я думаю, у вас проблема с вашим собственным Mac. Если вы пытались открыть веб-сайт с другого компьютера и не получили сообщение об ошибке, это означает, что вам необходимо переустановить пакет php. Что-то пошло не так со встроенным php (возможно, обновление или ссылка уничтожена из-за новой установки ...)

Надеюсь, что это поможет вам.

Попробуй это:

// Initiate the class
$className = 'Controller_' . ucfirst($controller);
if (class_exists($className)) {
     // construct the code string and evaluate it.
     $code='$controller = new ' . $className . '($this->registry);';
     eval($code);
}

Попробуйте использовать фигурные скобки вокруг переменной имени вашего класса. См. Ниже в строке назначения $ controller.

$className = 'Controller_' . ucfirst($controller);
if (class_exists($className)) {
 $controller = new ${$className}($this->registry);
}