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



对于任何读过我最后几个问题的人来说,我已经成功地将CI和Propel集成在一起,并且自动加载工作得很好。现在我要进入到推进本身的细微差别。

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

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

PolicytypeQuery::create()->find()的调用堆栈下面的某个地方,我们进入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");

它是"可解析的"(可见和可访问),但是你把名字搞错了。

BasePolicytype::PEER,不是Policytype::PEER

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

我在给一个现有的系统添加推进。在我的例子中,碰撞是一个名为"product"的表。我已经装了一把class Product。所以当我尝试使用推进,它永远不会自动加载推进Product类在所有。因此,没有定义的常数。使用错误的代码。

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

我是在读这段独白时发现的,谢谢David Rea。

最新更新