Автозагрузчик для Propel 1.5.6 работает не полностью

Я установил Propel 1.5.6 на свой Mac с PHP 5.12.14 через MacPorts. Я создал схему, сгенерировал модель, запустил задачи генерации и вставки sql, и теперь я перехожу к материалам времени выполнения.

У меня есть следующий код, который работает нормально (он создает строку, а затем подсчитывает количество строк):

<?php

// Set up some paths & schema info
$projectPath = realpath( dirname( __FILE__ ) . DIRECTORY_SEPARATOR . '..' );
$schemaName = 'database';
$modelPath = $projectPath . "/${schemaName}/build/classes";

// Init propel
require_once $projectPath . '/lib/propel-1.5/runtime/lib/Propel.php';
Propel::init($projectPath . "/${schemaName}/build/conf/${schemaName}-conf.php");

// Add the generated 'classes' directory to the include path
set_include_path($modelPath . PATH_SEPARATOR . get_include_path());

// This seems to be sufficient to get the autoloader working ***
require_once $modelPath . '/database/NodePeer.php';

$node = new Node();
$node->setName('My Node');
$node->setHash(sha1($node->getName()));
$node->save();

$nodes = NodePeer::doSelect(new Criteria());
echo 'Node count: ' . count($nodes) . "\n";
?>

Однако, если я удалю строку с отмеченным звездочкой комментарием, я ожидаю, что он все равно будет работать - я думаю, что автозагрузчик должен сработать и загрузить все необходимые для меня классы модели. Однако я получаю следующее:

Неустранимая ошибка: неопределенная константа класса «ИМЯ» в (проект)/база данных/сборка/классы/база данных/ом/BaseNode.php в строке 211

Я взломал автозагрузчик, чтобы отображать классы, которые он загружает, и обнаружил, что он действительно загружает некоторые классы:

Автозагрузка: узел

Автозагрузка: базовый узел

Однако, когда он загружает BaseNode, он борется со статической ссылкой на класс Peer. Я считаю, что это так, если BaseNode также требуется вручную.

  • Пытается ли PHP в моей конфигурации автоматически загружать статически называемые методы/константы?
  • Или может быть проблема в том порядке, в котором автозагрузчик Propel загружает вещи?

В настоящее время я буду продолжать, как есть — включение пира не является серьезной проблемой, — но я хотел бы знать, смогу ли я обойтись без него. Одним поводом для размышлений меньше!


person halfer    schedule 13.02.2011    source источник
comment
Интересный. Я удалил require_once в классе Peer и удалил четыре строки, используемые для сохранения нового экземпляра модели. Это оставляет вызов NodePeer::doSelect() static в качестве первого экземпляра PHP, который должен вызвать автозагрузку. Однако он этого не делает — вообще не предпринимается никаких попыток автозагрузки. Проблема с PHP, возможно?   -  person halfer    schedule 13.02.2011
comment
Ответы по-прежнему приветствуются, но имейте в виду, что я отправил это на официальный сайт Справочный канал Propel. Спасибо.   -  person halfer    schedule 20.02.2011
comment
Это решено. Согласно обсуждению в другом потоке, я обнаружил, что есть проблема с автозагрузчиком с таблицами моделей, которые конфликтуют с существующими классами Propel (в моем случае узел генерирует конфликтующий класс с именем NodePeer). Решение состоит в том, чтобы назвать таблицу как-то иначе или обновиться до PHP 5.3 и включить функцию пространства имен Propel.   -  person halfer    schedule 22.02.2011


Ответы (1)


В этом случае автозагрузчик не работал, потому что моя модель сгенерировала класс, конфликтующий с интерфейсом, предоставляемым ядром Propel. Переименование сработало бы, как и использование системы пространства имен (хотя, конечно, последнее зависит от использования PHP 5.3.+).

person halfer    schedule 25.10.2011