3

私はこのコードを持っています:

abstract class Base{

   public function delete(){
     // Something like this (id is setted in constructor)
     $this->db->delete($this->id);
   }

}

次に、たとえば Base を拡張する別のクラスがあります。

class Subtitles extends Base{

    public function delete($parameter){
         parent::delete();
         // Do some more deleting in transaction using $parameter
    }

}

これにはたまたまメソッド delete があります。

問題は次のとおりです。

私が電話するとき

$subtitles->delete($parameter)

私は得る:

Strict error - Declaration of Subtitles::delete() should be compatible with Base::delete() 

だから私の質問は、なぜ私は異なるパラメータを持つ子孫のメソッドを持つことができないのですか?

説明していただきありがとうございます。

4

3 に答える 3

6

これは、PHP がメソッドのオーバーロードではなくメソッドのオーバーライドを行うためです。したがって、メソッド シグネチャは正確に一致する必要があります。

問題の回避策として、基本クラスの削除を再構築して

public function delete($id = null){
  // Something like this (id is setted in constructor)
  if ($id === null) $id = $this->id;
  $this->db->delete($id);
}

次に、サブクラスのメソッド シグネチャを一致するように変更します。

于 2013-07-24T15:27:36.197 に答える
1

これは、@orangePill の主張に対するコメントであると思われますが、コメントするほどの評判はありません。

私はこれと同じ問題を静的メソッドで抱えていたので、late static bindingを使用して次のことを行いました。おそらくそれは誰かを助けるでしょう。

abstract class baseClass {
    //protected since it makes no sense to call baseClass::method
    protected static function method($parameter1) {
        $parameter2 = static::getParameter2();

        return $parameter1.' '.$parameter2;
    }
}

class myFirstClass extends baseClass {
    //static value, could be a constant
    private static $parameter2 = 'some value';

    public static function getParameter2() {
        return self::$parameter2;
    }

    public static function method($parameter1) {
        return parent::method($parameter1);
    }
}

class mySecondClass extends baseClass {
    private static $parameter2 = 'some other value';

    public static function getParameter2() {
        return self::$parameter2;
    }

    public static function method($parameter1) {
        return parent::method($parameter1);
    }
}

使用法

echo myFirstClass::method('This uses'); // 'This uses some value'

echo mySecondClass::method('And this uses'); // 'And this uses some other value'
于 2014-07-23T18:13:58.153 に答える