-2

親クラスに依存する静的または非静的として子クラスのメソッドを宣言したい。私はphpを使用していますが、バージョンが変更されたため、この問題が発生しています。誰か助けてください。これは、正確に何が変更されたかを示す例です

//in earlier version
class parent{

  function test(){
    //some code here
  }
}

class child extends parent{

  function test(){
    //some code here
  }
}

//in new version
class parent{

  static function test(){
    //some code here
  }
}

class child extends parent{

  function test(){
    //some code here
  }
}

致命的なエラー:クラスの子で静的メソッドparent::test()を非静的にすることはできません

コードを両方のバージョンと互換性を持たせたいのですが、どうすればよいですか?

4

2 に答える 2

2

序文: これは本当に悪い考えです。基本フレームワークに 2 つのバージョン間で根本的な変更があり、API の下位互換性が失われた場合は、古いバージョンと新しいバージョンを個別に対象とするクラスの 2 つの個別のバージョンを作成する必要があります。に変更されたのは関数シグネチャだけではない可能性が高く、新しい方法でstatic動作するように多くのコードを変更する必要がある可能性が最も高いでしょう。static

ただし、文字通りの質問に答えるには:変更は単に互換性がないため、両方と互換性のある1つのクラスを作成することはできません。ただし、対象とするバージョンに応じて、異なるクラスを動的に宣言できます。ベース フレームワークに読み取り可能な明らかなバージョン番号がない場合は、親クラスをイントロスペクトできます。

$class  = new ReflectionClass('Parent');
$method = $class->getMethod('test');

if ($method->isStatic()) {
    // include code for new version
    require_once 'child.new.class.php';
} else {
    // include code for old version
    require_once 'child.old.class.php';
}

繰り返しますが、同じ名前でコードが重複しているため、これはかなり悪い考えです。しかし、それが唯一の選択肢です。

于 2012-11-27T08:07:45.797 に答える
0

静的メソッドを非静的メソッドでオーバーライドすることはできません。子で簡単なオーバーライドを試すことができます

public static function test(){
 //some code here
 }

あなたの場合に受け入れられる場合。

本当に、あなたは非常に悪いコーディング方法で立ち往生しています。親クラスに静的メソッドまたは非静的メソッドがあるかどうかを確認するよりも、より良い解決策を見つける必要があります。

于 2012-11-27T07:17:43.890 に答える