跟踪令人困惑的PHP问题(可能是__set/__get magic?)


Tracing confusing PHP issue (might be __set/__get magic?)

我正在用Propel做各种各样的东西,这可能有点边缘情况 -特别是我发现与表名相关的类名被缓存在某个地方,并且由于我用不同的类名重建模型,但相同的表名(用于单元测试目的)Propel正在进入正确的困境。(这个问题不需要有Propel经验;只是对PHP的理解,可能是魔法调用)

为了调试此问题,我发现在设置列值时,Propel会为表填充"tablemap"类。我的目的是找出在代码中这个人口发生的地方,所以我可以清除缓存的表映射(s)在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()方法,所以我很困惑这里会触发什么代码。

任何想法?

D'oh!事后看来,这是很明显的!

我添加了一行来打印debug_backtrace(),并找到了触发表地图填充的代码。这最终表明,使用TestOrganiserPeer触发Propel的自动加载器,当一个对等类被加载时,这反过来又导致立即调用BaseTestOrganiserPeer::buildTableMap()