4

CRUDable (保存および削除可能) なエンティティのインターフェイスを作成したいと考えています。ここに私の抽象クラスがあります:

abstract class AbstractCrudableEntity extends AbstractEntity
{
    abstract public function doSave();
    abstract public function doDelete();
}

私の実装クラスには、これらのメソッドに追加のパラメーターがいくつか必要です。実装クラスのシグネチャは次のとおりです。

class Contact extends AbstractCrudableEntity {
    public function doSave(User $user, \UberClientManager $manager);
    public function doDelete(User $user, \UberClientManager $manager);
}

PHP では、実装クラスが親クラスと同じメソッドのパラメーターを持つ必要があることを理解しています (この質問に答えるいくつかの質問があります:たとえば、this )。それは問題ではありません。

しかし、最近、認証トークンを扱う Symfony のコードに出くわしました。クラスは をUsernamePasswordToken拡張し、メソッドAbstractToken内に異なるパラメーターのセットを持っています:対.__construct()AbstractToken::__construct()UsernamePasswordToken::__construct()

私の質問は、Symfony がこれをどのように行うことができるかということです。これと私のコードの違いは何ですか?

4

2 に答える 2

8

コンストラクタのオーバーライドは特殊なケースです:

他のメソッドとは異なり、親メソッドとは異なるパラメーターでオーバーライドされE_STRICTた場合、PHP はレベル エラー メッセージを生成しません。__construct()__construct()

他の方法ではできません。

于 2012-10-31T12:47:52.973 に答える
0

子メソッドには、抽象親クラスの抽象メソッドと同じ数のパラメーターが必要です。

あなたの例のコンストラクターは抽象的ではありません。子はそれをオーバーライドしているだけです。

于 2012-10-31T12:48:24.313 に答える