Отслеживание запутанной проблемы PHP (может быть __set / __ get magic?) - PullRequest
0 голосов
/ 21 ноября 2011

Я делаю все с Propel, что, вероятно, немного крайний случай - в частности, я обнаружил, что имя класса, связанное с именем таблицы, где-то кешируется, и из-за моей перестройки модели с другим Имена классов, но те же имена таблиц (для целей модульного тестирования) Propel идет в правильном направлении. (Вам не понадобится опыт работы с Propel для этого вопроса; просто понимание PHP, возможно, магические вызовы в частности) .

Чтобы устранить эту проблему, я обнаружил, что Propel заполняет класс «tablemap» для таблицы, когда устанавливается значение столбца. Мое намерение состоит в том, чтобы выяснить, где в коде происходит это заполнение, чтобы я мог очистить кэшированные таблицы таблиц в Propel.

В частности, класс TestOrganiser имеет сгенерированный родительский BaseTestOrganiser, и у него есть метод установки столбца, таким образом:

// The ** lines are mine, the rest are auto-generated by propel.
// The output when setting a value and saving is "no yes " which
// shows that the '$this->modifiedColumns[]' line triggers the
// tablemap population
public function setName($v)
{
    if ($v !== null) {
        $v = (string) $v;
    }

    if ($this->name !== $v) {
        $this->name = $v;

        $map = Propel::getDatabaseMap('test'); // **
        echo $map->getTables() ? 'yes ' : 'no '; // **
        $this->modifiedColumns[] = TestOrganiserPeer::NAME;
        echo $map->getTables() ? 'yes ' : 'no '; // **
    }

    return $this;
} // setName()

Согласно комментариям, значение $ map-> getTables () перемещается из пустого в непустое в результате строки $this->modifiedColumns[] = TestOrganiserPeer::NAME. Однако в этом классе, его потомке или родителях нет метода __set (), поэтому я совершенно не понимаю, какой код может быть запущен здесь.

Есть идеи?

1 Ответ

1 голос
/ 21 ноября 2011

D'Oh!Оглядываясь назад, это вполне очевидно!

Я добавил строку для вывода debug_backtrace() и нашел код, который запускает заполнение таблицы.Это в конечном итоге показало, что использование TestOrganiserPeer запускает автозагрузчик Propel, и когда загружается класс однорангового узла, это, в свою очередь, приводит к немедленному вызову BaseTestOrganiserPeer::buildTableMap().

...