私はいくつかの保護されたフィールドとそれらを使用するメソッドを持つオブジェクトを持っています。このメソッドは、私が必要とするものとまったく同じものではありませんが、アドオンを作成しているので元のコードを変更することはできません。 元のクラスのあらかじめ定義されたオブジェクトで呼び出せるように、クラスを拡張してメソッドをオーバーライドすることは、どういうわけかできますか?私は猿のパッチについて考えましたが、明らかにそれはPHPで実装されていません。PHP:メソッドの動作を変更する
答えて
親クラスを拡張し、親クラスではなく新しいクラスを開始し、メソッドを親メソッドと全く同じ名前にすることによって、メソッドをオーバーライドできます。つまり、親メソッドではなく子メソッドが呼び出されます。
例:
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
私の場合、開始はどこか別のところで起こりますが、残念ながら – Simoroshka
クラスの開始を変更せずにメソッドを上書きすることはできません。 – joshualawson
これには[runkit](https://pecl.php.net/package/runkit)を使うことができます。しかし、置き換えるメソッドを使用する他のメソッドの予期しない動作に遭遇する可能性があります。 – wazelin
私は以下の状態がうまくいくことを願っています。そのクラスはFoo
であり、方法はbar()
です。 bar()
メソッドをオーバーライドするには、下記のようにcustomFoo
クラスを作成する必要があります。
class CustomFoo extends Foo{
public function bar(){
parent::bar();
}
}
詳細については説明していないため、実際に必要なことはわかりません。それでも私はベストを尽くしました。 :)
オブジェクトが現在派生している親クラスまたは親クラスを拡張する子クラスを作成してみてください。 Parentクラスのメソッドとまったく同じ名前の新しいメソッドを作成し、ロジックをそこに配置します。 新しいクラスからオブジェクトをインスタンス化すると、その特定のメソッドをオーバーライドすることに成功し、引き続き基本クラスのメソッドとプロパティにアクセスできます。
問題は、クラスをロードしたら、あなたは正式にそれをアンロードすることはできません、あなたはそれを拡張するためにそれをロードする必要があります、です。それで結構です。これは
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.
}
:あなたの最善の策は、元のクラス(理想的ではない)をハックしたりコピーし、新しいファイルに元のクラス定義を貼り付けるのいずれかであります独自の修正されたクラスが元のクラスの前にロードされることを保証するために行われます。 これは非常にハッキーですので、使用しているフレームワークがネイティブサポートしているかどうか最初に確認してください。
これは、このクラスを使用できる他のすべてのものにも影響しますか? – Simoroshka
はい、このソリューションは理想的ではありません。あなたが本当に本当に本当に他のオプションを持っていない場合にのみ、それを使用してください。 – apokryfos
- 1. 動的にonclickメソッドを変更する
- 2. プロパティ変更時のPHP実行メソッド
- 3. Djangoクラスベースのビューでgetメソッドの動作を変更するためのMixin
- 4. TaxonomyFieldDriverの動作を変更する
- 5. 別の動作を変更するグラードタスク
- 6. ソフトウェアの動作を変更する
- 7. JMXReporterのデフォルト動作を変更する
- 8. window.openの動作を変更する
- 9. サブオブジェクトの動作を変更する
- 10. Prestashop:コアコントローラの動作を変更する
- 11. ソートオブジェクトの動作を変更する
- 12. Wordpress Pluginの動作を変更する
- 13. joomla1.5のアクティベーション動作を変更する
- 14. php-interbaseのデフォルトのトランザクション動作を変更しました
- 15. PHPセッションの変な動作
- 16. vue.js:値を変更するメソッドを切り替えるが、ビュー内で動作が変更されない
- 17. PHP変更html移動中
- 18. move_uploaded_file PHPメソッドが動作しない
- 19. gmdateメソッドでタイムゾーンを変更するには? PHP
- 20. スカラトラフィルタの動作の変更
- 21. ルータを変更した後にphp sendmailが動作しない
- 22. 動的PHPメソッド
- 23. ボタンエフェクトを変更するメソッドを作成する#
- 24. 変更のRails /レーキテストデフォルト動作
- 25. jQueryのreplaceWith()メソッドはPHPコードをHTMLコメントに変更します
- 26. PHPの可変メソッド?
- 27. win32ウィンドウのドラッグ/移動の動作を変更する
- 28. SKProductStorePromotionController更新メソッドが動作しない
- 29. Laravel更新メソッドが動作しない
- 30. 更新メソッドが動作しない
これは、元のクラスが登録されたオートローダーを使用して自動ロードされている場合、独自のクラスとオートローダーを作成し、オートロード・チェーンを使用してオートローダーを先に進めることができます。おそらくフレームワークを使用している場合は、これがネイティブで許可されているかどうかを確認する必要があります(Laravelはこれを行う際に大きなサポートを提供します)。全体的には、ここに役立つ情報はほとんどありません。 – apokryfos
私はモックアップの例を作り上げようとしていましたが、プロジェクト構造はネストされたクラスのトムと畳み込まれていて、どの部分が関係しているかを判断することは難しいです。 – Simoroshka