0

这个问题很简单,我敢肯定,我只是不知道答案。

我有一个扩展另一个类的类。当我尝试使用 parent::method 使用父类中的功能时,我得到“调用未定义的方法'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

4

1 回答 1

4

我试图验证链接到 PHP 5.3.3 编辑中的评论中的代码,但我得到了

A getTest
B getTest

与评论的输出相反

A getTest
B gettest

所以我唯一能想到的是你正在使用其他版本的 PHP,并且你遇到了这种行为作为一个错误(回归或不回归)。

编辑:找到它,确实是在PHP 5.2.10中修复的错误:

如果parent::<method-name>(注意:这是*不是*静态调用)在子类中调用,并且在父类<method-name>中不存在,则为父类的__call()魔术方法提供$name小写的方法名称(参数)。

  • 修复了错误#47801(通过 parent:: 运算符访问的 __call() 提供了不正确的方法名称)。(费利佩)
于 2011-02-08T17:42:37.050 回答