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()は、データベースモデルクラスである親クラスの単なるゲッターです。

また、ローカルで動作しました。これが発生したのは、ベータプッシュの後でのみです。

アップデート

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 に答える