これは特定の既知の設計パターンではなく、特に oxid 用に作成された機能です。Oxid のクラスは、「new」ではなく、ファクトリ (oxnew("oxarticle") など) によってインスタンス化されます。oxarticle に登録済みのモジュールが存在しない場合、ファクトリは単に oxarticle のインスタンスを返します。
モジュールが「myOxarticle」を oxarticle の拡張として登録した場合、oxnew("oxarticle") は myOxarticle インスタンスを返し、myOxarticle は oxarticle から拡張されます。このクラス チェーンは、ファクトリによって構築されます。これが最初の利点です。「myOxarticle extends oxarticle」を使用したと想像してください。oxarticle を使用するすべての場所を変更して、オブジェクトが oxarticle の代わりに使用されるようにする必要があります。透明なクラスチェーンにより、ファクトリがこれを処理し、oxarticle オブジェクトが使用されるすべての場所で新しい機能が使用されるようになりました。oxnew("oxarticle") を呼び出す場所は、新しいオブジェクトについて知る必要はありません。
2 番目の利点は、同じ Oxid クラス、さらには同じメソッドを拡張する複数のモジュールがある場合です。ファクトリはバックグラウンドでクラス チェーンを構築し、oxnew("oxarticle") はチェーン内の最後のクラスのインスタンスを返します。クラスを拡張する場合は、すべてのメソッドで親メソッドを呼び出すことをお勧めします。したがって、基本クラスの特定のメソッドが呼び出されると、すべてのモジュール クラスの各メソッドが実行され、各モジュールは他のモジュールについて知る必要はありません。
機能を拡張するもう 1 つの方法は、フックまたはフィルターの使用です。フックの欠点は、拡張可能なすべてのメソッドにフックを組み込む必要があることです。その場合でも、酸化方式の方が柔軟性があります。
クラスメソッドで親メソッドを呼び出せない理由がいくつかある場合があります。たとえば、親メソッドが発生させたくないことを行う場合などです。この場合、これによりモジュール間の独立性が失われるため、他に方法がない場合にのみ実行する必要があります。
既存の動作を変更したくないが、新しいページ コントローラーなど、モジュールのみが使用する独自のクラスを作成したい場合は、メタデータに "files" 配列があり、クラスをこの場合、たとえば、「mycontroller extends mycontroller_parent」ではなく、「mycontroller extends oxubase」を使用します。