2016-08-03 9 views
0

私はいくつかの保護されたフィールドとそれらを使用するメソッドを持つオブジェクトを持っています。このメソッドは、私が必要とするものとまったく同じものではありませんが、アドオンを作成しているので元のコードを変更することはできません。 元のクラスのあらかじめ定義されたオブジェクトで呼び出せるように、クラスを拡張してメソッドをオーバーライドすることは、どういうわけかできますか?私は猿のパッチについて考えましたが、明らかにそれはPHPで実装されていません。PHP:メソッドの動作を変更する

+1

これは、元のクラスが登録されたオートローダーを使用して自動ロードされている場合、独自のクラスとオートローダーを作成し、オートロード・チェーンを使用してオートローダーを先に進めることができます。おそらくフレームワークを使用している場合は、これがネイティブで許可されているかどうかを確認する必要があります(Laravelはこれを行う際に大きなサポートを提供します)。全体的には、ここに役立つ情報はほとんどありません。 – apokryfos

+0

私はモックアップの例を作り上げようとしていましたが、プロジェクト構造はネストされたクラスのトムと畳み込まれていて、どの部分が関係しているかを判断することは難しいです。 – Simoroshka

答えて

1

親クラスを拡張し、親クラスではなく新しいクラスを開始し、メソッドを親メソッドと全く同じ名前にすることによって、メソッドをオーバーライドできます。つまり、親メソッドではなく子メソッドが呼び出されます。

例:

class Foo { 
    function sayFoo() { 
     echo "Foo"; 
    } 
} 

class Bar extends Foo { 
    function sayFoo() { 
     echo "Bar"; 
    } 
} 

$foo = new Foo(); 
$bar = new Bar(); 

$foo->sayFoo() //Outputs: Foo 
$bar->sayFoo() //Outputs: Bar 
+0

私の場合、開始はどこか別のところで起こりますが、残念ながら – Simoroshka

+0

クラスの開始を変更せずにメソッドを上書きすることはできません。 – joshualawson

+0

これには[runkit](https://pecl.php.net/package/runkit)を使うことができます。しかし、置き換えるメソッドを使用する他のメソッドの予期しない動作に遭遇する可能性があります。 – wazelin

0

私は以下の状態がうまくいくことを願っています。そのクラスはFooであり、方法はbar()です。 bar()メソッドをオーバーライドするには、下記のようにcustomFooクラスを作成する必要があります。

class CustomFoo extends Foo{ 
    public function bar(){ 
     parent::bar(); 
    } 
} 

詳細については説明していないため、実際に必要なことはわかりません。それでも私はベストを尽くしました。 :)

0

オブジェクトが現在派生している親クラスまたは親クラスを拡張する子クラスを作成してみてください。 Parentクラスのメソッドとまったく同じ名前の新しいメソッドを作成し、ロジックをそこに配置します。 新しいクラスからオブジェクトをインスタンス化すると、その特定のメソッドをオーバーライドすることに成功し、引き続き基本クラスのメソッドとプロパティにアクセスできます。

0

問題は、クラスをロードしたら、あなたは正式にそれをアンロードすることはできません、あなたはそれを拡張するためにそれをロードする必要があります、です。それで結構です。これは

spl_autoload_register(function ($class) { 
     if ($class == "ParentClass") { //Namespace is also included in the class name so adjust accordingly 
     include 'path/to/modified/ParentClass.php'; 
     } 
},true,true); 

:あなたのフレームワークのブートストラップ後にどこか

class ParentClass { 
     //Copy paste code and modify as you need to. 
} 

:あなたの最善の策は、元のクラス(理想的ではない)をハックしたりコピーし、新しいファイルに元のクラス定義を貼り付けるのいずれかであります独自の修正されたクラスが元のクラスの前にロードされることを保証するために行われます。 これは非常にハッキーですので、使用しているフレームワークがネイティブサポートしているかどうか最初に確認してください。

+0

これは、このクラスを使用できる他のすべてのものにも影響しますか? – Simoroshka

+1

はい、このソリューションは理想的ではありません。あなたが本当に本当に本当に他のオプションを持っていない場合にのみ、それを使用してください。 – apokryfos

関連する問題