在php中访问当前类的函数版本

时间:2012-12-03 22:11:33

标签: php javascript class

我正在尝试用PHP开发一个可以生成JS“类”的系统,我有一个可行的实现。我遇到的问题包括多个这些JS类的包含;我的代码会在每次需要时打印出JS类,我希望它只在第一次打印出来。

我目前解决这个问题的方法并不优雅;它要求PHP类开发人员显式调用一个函数,该函数将检查是否已包含JS类。 e.g:

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()将始终返回类heirarchy中最低类的类名,因为它是函数的最新重写版本。

如果父类正在调用getJSClass(),我需要它能够检查jsClassName()中的类名是否已被包含。但它不能是为最低类重写的jsClassName()版本,它必须是父类中定义的版本。

有没有办法访问函数的“当前”类版本?通过current,我的意思是定义当前函数的类。这样,当我们向上移动parent :: chain时,jsClassName将反映相关的类名。

1 个答案:

答案 0 :(得分:1)

您可以使用数组来跟踪您的类链,只有在键jsClassName()不存在的情况下才添加该类:

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

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

最顶层的实现与初始化数组略有不同:

public function getJSClass()
{
    return array(
        $this->jsClassName() => "implementation",
    );
}