php - "Could not execute Model_Hotel::__construct()"与 mysql_fetch_object,属性保持未初始化

标签 php kohana initialization construct

我在 Mac OS X Lion 上运行 PHP 5.3.6 和 MAMP 2.0.1,并且使用 Kohana 3.1.3.1。

我尝试用我自己的方法重写标准 Kohana ORM 模块的 __set() 和 __get() 方法。我的一些模型扩展了我的类,从而扩展了 ORM 类。

<?php

class ORM_Localization extends ORM
{

    protected static $_language_cache = array();
    protected $_languages = array();

    public function __construct($id = NULL)
    {
        parent::__construct($id);

        // Load languages which are accepted by the client
        $this->_languages = array_keys(Application::languages());
    }

    public function __get($name)
    {
        /* Debugging #1 */ echo 'GET'.$name;
        /* Debugging #2 */ // exit;
        return $this->localization($name);
    }

    public function __set($name, $value)
    {
        /* Debugging #3 */ var_dump($this->_table_columns);
        /* Debugging #4 */ echo 'SET::'.$name;
        /* Debugging #5 */ // exit;
        $this->localization($name, $value);
    }

    public function localization($name, $value = NULL)
    {
        if (!array_key_exists($name, $this->_table_columns)) {
            // Load avaiable languages from database if not already done
            if (empty(ORM_Localization::$_language_cache)) {
                ORM_Localization::$_language_cache = ORM::factory('languages')
                    ->find_all()
                    ->as_array('id', 'identifier');
            }

            $languages = array();

            // Find the IDs of the languages from the database which match the given language
            foreach ($this->languages as $language) {
                $parts = explode('-', $language);

                do {
                    $identifier = implode('-', $parts);

                    if ($id = array_search($identifier, ORM_Localization::$_language_cache)) {
                        $languages[] = $id;
                    }

                    array_pop($parts);
                } while($parts);
            }

            // Find localization
            foreach ($languages as $language) {
                $localization = $this->localizations->where('language_id', '=', $language)->find();

                try {
                    if ($value === NULL) {
                        return $localization->$name;
                    } else {
                        $localization->$name = $value;
                    }
                } catch (Kohana_Exception $exception) {}
            }
        }

        if ($value === NULL) {
            return parent::__get($name);
        } else {
            parent::__set($name, $value);
        }
    }

}

但是在 PHP 5.3.6 中,我收到以下错误消息:

Exception [ 0 ]: Could not execute Model_Hotel::__construct()

Model_Hotel 扩展了此类,并且没有自己的构造。 这是 Model_Hotel 的代码,一个标准的 Kohana ORM 模型:http://pastie.org/private/vuyig90phwqr9f34crwg

使用 PHP 5.2.17,我得到了另一个:

ErrorException [ Warning ]: array_key_exists() [function.array-key-exists]: The second argument should be either an array or an object

在 Kohana 中,扩展类的模型由 mysql_fetch_object() 调用,位于 orm 模块代码深处的某个位置。

但是,如果我在 __set() 中回显被调用的属性并随后退出(#4 和 #5),它会输出“SET::id”并且不会显示错误消息。

如果我 var_dump() $this->_table_columns (或此类的任何其他属性,#3),我会得到“NULL”,这是该属性在初始化之前的值。 如果我对 $this->_languages 重复相同的操作,我会得到一个空数组,该数组应该填充多种语言。就好像该类从未使用 __construct 进行初始化。这解释了我在 PHP 5.2.17 中遇到的错误,因为 $this->_table_columns 是 NULL 而不是数组。

我可以取消注释我的 __construct,但仍然遇到相同的错误,错误必须出在我的 localization() 方法中。

我已经搜索了好几天了,我完全不知道出了什么问题。

最佳答案

ORM::__set() 预计会从 mysql_fetch_object() 调用加载转换数据。为此,您必须允许它设置强制转换值:

public function __set($column, $value)
{
    if ( ! isset($this->_object_name))
    {
        // Object not yet constructed, so we're loading data from a database call cast
        $this->_cast_data[$column] = $value;
    }
    else
    {
        // Set the model's column to given value
        $this->localization($column, $value);
    }
}

虽然我也不喜欢这个解决方案,但你应该重写 ORM::set()

关于php - "Could not execute Model_Hotel::__construct()"与 mysql_fetch_object,属性保持未初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6801970/

相关文章:

php - Codeigniter V 其他 PHP 框架的可扩展性如何?

c++ - 用指定数量的单元化空间初始化一个 vector

c++ - 使用 () 或 {} 正确初始化现代 C++(C++11 及更高版本)中的变量?

ios - 在 UICollectionViewCell 初始化期间引用 IBOutlets

php - 只获取PHP版本号

php - 与远程服务器的PHP PDO连接改为连接到本地服务器

php - 在mysql表中存储面积单位转换

kohana - 如何在 Kohana 中获取当前请求的完整地址?

php - 在 laravel 5.3 中调用 null 的成员函数lists()

unix - 如何从 Kohana 3.2 升级到 3.3(实现 PSR-0)?