parent ::方法,方法被强制为小写导致无法找到方法

时间:2011-02-08 17:22:38

标签: php class methods parent lowercase

这个问题非常简单,我确定,我只是不知道答案。

我有一个扩展另一个类的类。当我尝试使用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

1 个答案:

答案 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()提供了错误的方法名称)。 (菲利普)
  •