在Codeigniter中使用gDoctirne ORM时出现致命错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在Codeigniter中使用gDoctirne ORM时出现致命错误相关的知识,希望对你有一定的参考价值。

我在Codeigniter中使用Doctrine ORM时收到以下错误消息。

( ! ) Fatal error: Call to a member function getAttribute() on a non-object in C:xampphtdocsgiftshoessystemdatabasedoctrineDoctrineRecord.php on line 1424
Call Stack
#   Time    Memory  Function    Location
1   0.0011  327560  {main}( )   ..index.php:0
2   0.0363  3210720 require_once( 'C:xampphtdocsgiftshoessystemcodeigniterCodeIgniter.php' )  ..index.php:116
3   0.0492  3922368 Welcome->Welcome( ) ..CodeIgniter.php:201
4   0.0817  6234096 CI_Loader->model( ) ..welcome.php:14
5   0.0824  6248376 Shoes->__construct( )   ..Loader.php:184
6   0.0824  6248424 Doctrine_Core::getTable( )  ..Shoes.php:5
7   0.0824  6248424 Doctrine_Connection->getTable( )    ..Core.php:1080
8   0.0824  6254304 Doctrine_Table->__construct( )  ..Connection.php:1123
9   0.0841  6396128 Doctrine_Table->initDefinition( )   ..Table.php:249
10  0.0841  6397472 Shoes->__construct( )   ..Table.php:301
11  0.0841  6397680 Doctrine_Access->__set( )   ..Access.php:0
12  0.0841  6397680 Doctrine_Record->set( ) ..Access.php:60

------------------学说表定义-------------

abstract class BaseShoes extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('shoes');
        $this->hasColumn('sku', 'integer', 11, array('primary' => true, 'autoincrement' => false));
        $this->hasColumn('name', 'string', 255);
        $this->hasColumn('keywords', 'string', 255);
        $this->hasColumn('description', 'string');
        $this->hasColumn('manufacturer', 'string', 20);
        $this->hasColumn('sale_price', 'double');
        $this->hasColumn('price', 'double');
        $this->hasColumn('url', 'string');
        $this->hasColumn('image', 'string');
        $this->hasColumn('category', 'string', 50);
    }

    public function setUp() {

    }
}

------------------------学说表格代码-------------------

class ShoesTable extends Doctrine_Table
{
    function getAllShoes($from = 0, $total = 15)
    {
        $q = Doctrine_Query::create()
        ->from('Shoes s')
        ->limit($total)
        ->offset($from);

        return $q->execute(array(), Doctrine::HYDRATE_ARRAY);
    }

}

-----------------型号代码-----------------

class Shoes extends BaseShoes
{
    function  __construct() {
        $this->table = Doctrine::getTable('shoes');
    }
    public function getAllShoes()
    {
        $this->table->getAllShoes();
    }
}
答案

我想 :

  • Shoes extends BaseShoes - 好吧,我们可以看到
  • BaseShoes extends Doctrine_Record

Doctrine_Record有一个__construct()方法,它做了很多东西。

如果在其中一个类中重新定义__construct()方法,它将覆盖在其父类中定义的__construct()方法。

这里 :

  • 你的Shoes::__construct()方法
  • 覆盖BaseShoes::__construct()
  • 它本身不存在,所以和Doctrine_Record::__construct()一样
  • 这似乎做了一些非常重要的与学说相关的事情;-)

没有测试,但在你自己的构造函数中调用父的构造函数可能会有所帮助:

class Shoes extends BaseShoes
{
    function  __construct() {
        parent::__construct();
        $this->table = Doctrine::getTable('shoes');
    }
    public function getAllShoes()
    {
        $this->table->getAllShoes();
    }
}

并且,作为参考,引用PHP手册的Constructors and Destructors页面:

注意:如果子类定义构造函数,则不会隐式调用父构造函数。 为了运行父构造函数,需要在子构造函数中调用parent::__construct()

不过,作为一个旁注,我不确定在一个Model类中使用Doctrine定义自己的构造函数是一个好主意 - 而且我从未见过这样做,实际上,据我记得......

这是一个blog-post on the Doctrine's blog,似乎表明我是对的(引用,强调我的):

[...]有人询问了Doctrine 2中实体的构造函数以及是否可以使用它。 我认为这是值得写的东西,因为在学说1中这是不可能的。构造函数是你的高手,并由Doctrine内部使用。

以下是Doctrine 1.2手册的相关部分:Overriding the Constructor

Doctrine不允许您覆盖Doctrine_Record::__construct()方法,但提供了另一种方法 [...]

以上是关于在Codeigniter中使用gDoctirne ORM时出现致命错误的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Codeigniter 中使用包含函数文件

在 codeigniter 中使用 HTTPOnly 标志设置 cookie

在视图中使用 foreach 的 Codeigniter

使用codeIgniter在MySQL中查找表是不是存在?

在模型中使用查询的 Codeigniter 分页

在 codeigniter 中使用聚合函数更新列