PHP,特征 - 静态变量和函数

时间:2014-02-15 14:02:28

标签: php traits

我有特征ExportOptions有两个静态变量和两个函数。

变量为$Code$ExportType$ExportType的内容在功能Set_ExportType中设置。两个变量在函数Convert_ExportCode中相互匹配。

函数Convert_ExportCode包含以下简单代码:

private function Convert_ExportCode()
{
    switch(static::$ExportType)
    {
        /*
         * writes code
        */
        case UniT::UNIT_OPTION_END:
            self::$GlobalCode[] = $this -> LocalCode;
            $Text = preg_replace('/([\n]+)/', "\n", implode('', self::$GlobalCode));
            self::$GlobalCode = array();
            echo $Text;
            break;
        /*
         * exports code without writing
        */
        case UniT::UNIT_OPTION_STEP:
            self::$GlobalCode[] = $this -> LocalCode;
            $Text = preg_replace('/([\n]+)/', "\n", implode('', self::$GlobalCode));
            self::$GlobalCode = array();
            return $Text;
            break;
        /*
         * saves part of code
        */
        default:
            self::$GlobalCode[] = $this -> LocalCode;
            for($Order = 0; $Order < count(self::$GlobalCode); $Order++)
            {
                self::$GlobalCode[$Order] = preg_replace('/([\n]+)/', "\n", self::$GlobalCode[$Order]);
            }
    }
}

并且它(当然是整个特征)由三个类使用(CodeGeneratorSimpleAssemblerMenuAssembler_SelectOptgroup)。如果那些类不能互相使用,那就没问题了。

其他类使用了类CodeGenerator - 类SimpleAssembler使用了类MenuAssembler_SelectOptgroup

我知道(因为我测试了它 - 并且该类位于第一级)CodeGenerator接受并输出(并处理)变量self::$Code的内容,即使它得到了文本包含在生成的任何封闭元素代码中。

public function Execute()
{
    $CodePartNumber = count(self::$Code);

    /* some code that not handles with sel::$Code */

    // base of code storage into self::$Code
    self::$Code[$CodePartNumber] = $this -> Get_AssembledCode(/* arguments for vsprintf */);

    return $this -> Convert_ExportCode();
}

SimpleAssembler以类似的方式组装和存储代码:

public function Execute()
{
    $this -> Check_Orders();
    $CodePartNumber = count(self::$Code);               

    /*
     * generation of sub-level
     */
    for($Order = 0; $Order < count($this -> Content); $Order++)
    {
        $VMaX = new CodeGenerator($this -> Elements['sub']['main']);
        $VMaX -> Set_Text((empty($this -> Content[$Order]) ? '' : $this -> Content[$Order] ));

        if($Order < count($this -> Content)-1 )
        {
            $VMaX -> Set_ExportType(UniT::UNIT_OPTION_GOON);
            $VMaX -> Execute();
        }
        else
        {
            $VMaX -> Set_ExportType(UniT::UNIT_OPTION_STEP);
            self::$Code[$CodePartNumber] = $VMaX -> Execute();
        }


    }

    if($this -> Disable_TopLevel == FALSE)
    {
        /*
         * generation of top level element and inserting of columns into it
        */
        $VMaX = new CodeGenerator($this -> Elements['top']['main']);
        $VMaX -> Set_ExportType(static::$ExportType);
        $VMaX -> Set_Text(self::$Code[$CodePartNumber]);
        return $VMaX -> Execute();
    }
    else
    {
        return $this -> Convert_ExportCode();
    }
}

但是'SimpleAssembler'类接受这个变量的内容有问题。最终输出是

<ol >
    <ol >   
        <li >1</li>
        <li >2</li>
        <li >3</li>     
    </ol>
    <li >4</li>
    <li >5</li>
    <li >6</li>
</ol>

代替

<ol >
    <li >1</li>
    <li >2</li>
    <li >3</li>     
</ol>

<ol >
    <li >4</li>
    <li >5</li>
    <li >6</li> 
</ol>

我想知道如何解决它。

修改 我尝试在各种操作之间使用非静态变量进行类内代码存储 - 并且只给出该静态变量的最终代码,即使我添加了

$this -> LocalCode = NULL;

到构造函数和析构函数,结果仍然相同。

修改 我将问题开头的代码改进到新版本,就像目前一样。

1 个答案:

答案 0 :(得分:0)

我非常接近解决方案......昨天晚上我终于找到了它。

使用附加变量是正确的方法。但是我犯了一个错误,因为我没有将各个级别(各个类)生成的代码完全分开。因为我认为使用该特征的每个类都有自己的同名静态变量。

所以,后来我将最初的简单数组拆分为更多维度的数组......来自

array([] => some code /* and so on */)

array([class][] => some code /* and so on */)

而且,我将这个数组变量从类之间的原始共享移动到我已经用于更容易访问某些选项(一些常量)的分离类。

而且,我原来只将一个特质与两个人分开了。

一个特性具有仅由该帮助类使用的静态数组类型变量 - 以及用于处理它的函数。

最初的数组内容设置在返回或打印它的函数之外(即使在使用了附加变量之后) - 并且在此函数内部仅确定是否将返回或打印它。目前,此数组类型变量的内容与类名一起直接设置到此函数中。此特征仅供帮助类使用。

其他特征具有该附加变量以及包含代码导出选项的静态变量 - 以及用于设置此选项的功能。生成任何代码的所有类都使用此特征。

我正在寻找更好的解决方案。