0

私は JS の「クラス」を生成できるシステムを PHP で開発しようとしていますが、動作する実装があります。私が直面している問題は、これらの JS クラスが複数含まれていることです。私のコードは必要になるたびに JS クラスを出力しますが、最初だけ出力したいのです。

この問題に対する私の現在の解決策は洗練されていません。PHP クラスの開発者は、JS クラスがまだインクルードされているかどうかを確認する関数を明示的に呼び出す必要があります。例えば:

public function getJSClass() {
//:: Call Parent
$js = parent::getJSClass();

//:: Add Current Class
if ($this->classNeeded('SearchAndManageDataManipulator')) {
    $js .= "
        //|| Class: SearchAndManageDataManipulator
        /**
         * Base class for applications which feature a search and results control
         * as the central element of the application.  Such applications generally
         * specialize in handling multiple records at once.
         */
        function SearchAndManageDataManipulator() {

            // ...

        }
        SearchAndManageDataManipulator.inheritsDM(WindowedDataManipulator);
    ";
}

//:: Return
return $js;
}

このチェックをクラス開発者から切り離して、次のようにしたいと思います。

public function getJSClass() {
return "
        //|| Class: SearchAndManageDataManipulator
        /**
         * Base class for applications which feature a search and results control
         * as the central element of the application.  Such applications generally
         * specialize in handling multiple records at once.
         */
        function SearchAndManageDataManipulator() {

            // ...

        }
        SearchAndManageDataManipulator.inheritsDM(WindowedDataManipulator);
    ";
}

したがって、クラスが必要な場合に getJSClass を呼び出す関数と、親の getJSClass()es; を作成したいと思います。関数には、既に含まれているかどうかを確認するために、クラスの名前が必要です。そのクラス名は、別の関数 jsClassName() をオーバーライドすることによって設定されます。ただし、jsClassName() を呼び出すと、関数のオーバーライドされた最新バージョンであるため、常にクラス階層で最下位のクラスのクラス名が返されます。

親クラスが getJSClass() を呼び出している場合、jsClassName() のクラス名がまだ含まれているかどうかを確認できるようにする必要があります。ただし、最下位クラス用にオーバーライドされた jsClassName() のバージョンにすることはできません。親クラスで定義されたバージョンである必要があります。

関数の「現在の」クラスのバージョンにアクセスする方法はありますか? 現在とは、現在の関数が定義されたクラスを意味します。このように、parent:: チェーンを上に移動すると、jsClassName は問題のクラス名を反映します。

4

1 に答える 1

1

配列を使用してクラス チェーンを追跡し、 key にクラスが存在しない場合にのみクラスを追加できますjsClassName()

public function getJSClass()
{
    $chain = parent::getJSClass();

    return $chain + array(
        $this->jsClassName() => "implementation here",
    );
}

最上位の実装は、配列を初期化するために少し異なります。

public function getJSClass()
{
    return array(
        $this->jsClassName() => "implementation",
    );
}
于 2012-12-03T23:00:07.033 に答える