0

我正在尝试用 PHP 开发一个可以生成 JS“类”的系统,并且我有一个可以工作的实现。我遇到的问题围绕着这些 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 回答