我在 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 中,我收到以下错误消息:
异常 [0]:无法执行 Model_Hotel::__construct()
Model_Hotel 扩展了这个类并且没有自己的构造。这是 Model_Hotel 的代码,一个标准的 Kohana ORM 模型:http ://pastie.org/private/vuyig90phwqr9f34crwg
使用 PHP 5.2.17,我得到了另一个:
ErrorException [警告]:array_key_exists() [function.array-key-exists]:第二个参数应该是数组或对象
在 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 并且我仍然得到相同的错误,错误必须在我的本地化()方法中。
我现在搜索了几天,我完全不知道可能出了什么问题。