0

我有一个类Tpl来使用这个函数挂载模板(template.php)

function Set($var, $value){
     $this->$var = $value;
  }

调用函数的 php 文件,例如 (form.php):

$t->Set("lbAddress","Address");

以及带有标签的模板的 html 文件 (template.html)

<tr><td>[lbAdress]</td></tr>

要打印 html 我有这个函数 (template.php) - 通知指向这个函数

function Show_Temp($ident = ""){
     // create array
     $arr = file($this->file);
     if( $ident == "" ){
        $c = 0; 
        $len = count($arr); 
        while( $c < $len ){
           $temp = str_replace("[", "$" . "this->", $arr[$c]);
           $temp = str_replace("]", "", $temp);
           $temp = addslashes($temp);
           eval("\$x = \"$temp\";");
           echo $x;
           $c++;
        }
     } else {
        $c = 0;
        $len = count($arr);
        $tag = "*=> " . $ident;
        while( $c < $len ){
           if( trim($arr[$c]) == $tag ){
              $c++;
              while( (substr(@$arr[$c], 0 ,3) != "*=>" ) && ($c < $len) ){
                 $temp = str_replace("[", "$" . "this->", $arr[$c]);
                 $temp = str_replace("]", "", $temp);
                 $temp = addslashes($temp);
                 eval("\$x= \"$temp\";"); //this is the line 200
                 echo $x;
                 $c++;
              }
              $c = $len;
           }
           $c++;
        }
     }
  }

如果模板 .html 有一行而我在 php 代码中[lbName]没有该行,我会收到错误。我找到的解决方案是添加类似的行,但是如果我在 HTML 中有 50 个我不在 PHP 中使用的标签,我必须添加所有 50 个。迁移到 PHP 5 后发生错误。有人可以帮助我吗?谢谢$t->Set("lbName","Name");PHP Notice: Undefined property: Tpl::$lbName in ../template.php(200) : eval()'d code on line 1$t->Set("lbName","");$t->Set("tag_name","");

4

1 回答 1

1

也许更好的方法仍然是不依赖于动态评估eval(通常最好eval在可能的情况下避免),而是[lbName]在需要时直接替换为对象中存储的值。如果您可以替换[lbName]$this->lbName,那么您当然也可以将其替换为lBName您即时查找的值吗?


但是,要回答您的原始问题:

如果我理解正确,您正在设置这样的值:

$t->Set('foo', 'bar');

并且 - 有效地 - 让他们像这样:

$t->foo;

如果是这样,您可以实现一种__get方法来拦截属性引用并提供您自己的逻辑来检索值;例如:

public function __get($key)
{
    // You can adapt this logic to suit your needs.
    if (isset($this->$key))
    {
        return $this->$key;
    }
    else
    {
        return null;
    }
}

在这种情况下,您最好使用关联数组作为后备存储,然后使用__getand__set访问它;例如:

class Template
{
    private $values = array();

    public function __get($key)
    {
        if (array_key_exists[$key, $this->values])
        {
            return $this->values[$key];
        }
        else
        {
            return null;
        }
    }

    public function __set($key, $value)
    {
        $this->values[$key] = $value;
    }
}
于 2013-01-18T13:24:54.240 回答