在基类中定义的Const在子类中不可解析

时间:2011-08-15 02:17:27

标签: php propel

对于已阅读过我最后几个问题的人,我已成功获得CI和Propel集成和自动加载功能非常出色。现在我正在探讨Propel本身的细微差别。

从我的CI控制器,我想通过Propel查询表中的所有记录。所以我的控制器中的代码是这样的:

function index() {
    $data = array();
    $data['policytypes'] = PolicytypeQuery::create()->find();
    $this->load->view('policytype_view',$data);
}

PolicytypeQuery::create()->find()的callstack中,我们进入ModelCriteria::__construct(),产生以下错误:

constant(): Couldn't find constant Policytype::PEER

以下是整个__construct()方法:

public function __construct($dbName = null, $modelName, $modelAlias = null){
    $this->setDbName($dbName);
    $this->originalDbName = $dbName;
    $this->modelName = $modelName;
    // THIS LINE GENERATES THE ERROR
    $this->modelPeerName = constant($this->modelName . '::PEER');  
    $this->modelAlias = $modelAlias;
    $this->tableMap = Propel::getDatabaseMap($this->getDbName())->getTableByPhpName($this->modelName);
}

因此,生成的 Policytype 类只是一个存根,并且继承自 BasePolicytype ,它有更多的东西(但也会生成)。在 BasePolicytype 中,我们有:

abstract class BasePolicytype extends BaseObject  implements Persistent
{

    /**
     * Peer class name
     */
    const PEER = 'PolicytypePeer';

所以...... const是在基类中定义的。 为什么儿童班无法解决?


更新

所以,这个 工作:

abstract class ClassA {
    const CLASSA_CONST = 'foo';
}

class ClassB extends ClassA {
}

class ClassC {
    function __construct($classname){
        echo constant($classname . "::CLASSA_CONST");
    }
}

$c=new ClassC("ClassB");

两者都在PHP 5.3下运行。

2 个答案:

答案 0 :(得分:2)

它是“可解析的”(可见且可访问),但你的名字错了。

它是BasePolicytype::PEER,而不是Policytype::PEER

答案 1 :(得分:2)

我刚才遇到了上面描述的完全相同的问题,但是,在我的情况下,问题不是Propel的错误。这是我代码中的类名冲突

我正在向现有系统添加推进功能。在我的例子中,碰撞是一个叫做“产品”的表。我已经加载了class Product。因此,当我尝试使用propel时,永远不会自动加载推进Product。因此,未定义的常量。它使用了错误的代码。

解决方案取决于您的情况。我不希望这是一个快速转换,我不想重构已弃用的代码,所以我在我的架构中重命名Product。在不同的情况下,我可能会重构旧代码以避免冲突。

我想到了这一点this soliloquy,感谢David Rea。