这个问题非常简单,我确定,我只是不知道答案。
我有一个扩展另一个类的类。当我尝试使用parent ::方法来使用父类的功能时,我得到“调用未定义的方法'parentClass':: getid()”。
它的作用是,强制方法名称是小写的。从上面的例子中,parent :: getId()被强制为parent :: getid();
我不知道为什么会这样?有什么想法吗?
代码示例
Class myClass extends OtherClass {
public function getProductList() {
//does other stuff
return parent::getId();
}
}
尝试运行parent :: getid()而不是parent :: getId()。 getId()只是父类的一个getter,它是一个数据库模型类。
同样在本地工作,只有在我推测这种情况后才发生。
更新
parent::getId()
调用__call
方法
/**
* @method __call
* @public
* @brief Facilitates the magic getters and setters.
* @description
* Allows for the use of getters and setters for accessing data. An exception will be thrown for
* any call that is not either already defined or is not a getter or setter for a member of the
* internal data array.
* @example
* class MyCodeModelUser extends TruDatabaseModel {
* ...
* protected $data = array(
* 'id' => null,
* 'name' => null
* );
* ...
* }
*
* ...
*
* $user->getId(); //gets the id
* $user->setId(2); //sets the id
* $user->setDateOfBirth('1/1/1980'); //throws an undefined method exception
*/
public function __call ($function, $arguments) {
$original = $function;
$function = strtolower(preg_replace('/(?<=[a-z])([A-Z])/', '_$1', $function));
$prefix = substr($function, 0, 4);
if ($prefix == 'get_' || $prefix == 'set_') {
$key = substr($function, 4);
if (array_key_exists($key, $this->data)) {
if ($prefix == 'get_') {
return $this->data[$key];
} else {
$this->data[$key] = $arguments[0];
return;
}
}
}
$this->tru->error->throwException(array(
'type' => 'database.model',
'dependency' => array(
'basic',
'database'
)
), 'Call to undefined method '.get_class($this).'::'.$original.'()');
}
这是一个在PHP.net上抛出相同错误的示例:http://www.php.net/manual/en/keyword.parent.php#91315
答案 0 :(得分:4)
我尝试验证PHP 5.3.3编辑中链接到的that comment中的代码,但是我得到了
A getTest
B getTest
与评论的
输出相反A getTest
B gettest
所以我唯一可以想到的是你正在使用其他版本的PHP,并且你将这种行为看作是一个bug(退化与否)。
编辑:在indeed a bug中找到了PHP 5.2.10:
如果在子类中调用
parent::<method-name>
(注意:这不是*静态调用),并且父级中不存在<method-name>
,则父级__call()
魔术方法以小写形式提供方法名称($name
参数)。
- 修正了错误#47801(通过parent :: operator访问的__call()提供了错误的方法名称)。 (菲利普)