【问题标题】:Create methods in a php class dynamically, so to have access to $this在 php 类中动态创建方法,以便访问 $this
【发布时间】:2014-07-22 21:11:18
【问题描述】:

我有一个在(非常大的)循环中执行 eval 语句的类。 eval 语句是需要处理的数据库存储代码(混合 html 和 php)。但是,因此存在严重的性能问题。

我不想在循环中每次都解析 eval 语句,而是想从来自我的类​​中的数据库的可用 eval 代码创建一个动态方法。

我想到了下面的伪代码,以便将eval代码转换为方法:

class foo
{
    private $test=3;
    public function doloop()
    {   
        for($i=0;$i<5;$i++)
        {
            $string="echo 50 * \$this->test.'<br>';";
            $func="evalcode_001";
            if(!isset(${$func}))
            {
                ${$func}=create_function('',$string);
            }

            ${$func}();
        }
    }
}
$obj_foo = new foo();
$obj_foo->doloop();//must output '150<br>150<br>150<br> .....'

但是,在运行它时,我收到错误消息“在...中不在对象上下文中时使用 $this”。所以很明显我并没有真正在类中创建方法。

所以我的问题是: 如何动态地为类创建方法并为给定方法分配代码。基本上我希望能够做到:

$obj_foo->evalcode_001(); 

在上面的例子中。

帮助赞赏

PS 我用的是 PHP5.4

【问题讨论】:

  • FWIW:将 code 存储在数据库中是一个非常糟糕的主意。除了您显然遇到的问题之外,您正在编写 PHP 代码并且几乎无法更改它,因为您拥有大量的数据库“数据”,这取决于代码中的某些细节。
  • 嗨;我同意,但它是存储模板数据的地方,用于信件和 CMS。大多数是纯 html,但多年来已经完成了自定义,其中包括 PHP 代码。
  • 见这里:stackoverflow.com/questions/12868066/… 具体来说,他们提到不使用 create_function(他接着说他认为这不适用于方法和类)。

标签: php


【解决方案1】:

如果您可以在字符串中更改$this-&gt;test(或编写额外的preg_match),您可以使用:

<?php

class foo
{
    public $test=3;

    public $functions = array();
    public function doloop()
    {   
        for($i=0;$i<5;$i++)
        {
            $string="echo 50 * \$this->test.'<br>';";
            $func="evalcode_001";
            if(!isset($this->functions[$func]))
            {
                $string = str_replace('$this','$object', $string );
                $this->functions[$func]= create_function('$object',$string);                
            }

            $this->functions[$func]($this);
        }
    }

    public function __call($name, $arguments) {
      if (isset($this->functions[$name])) {
          return $this->functions[$name]($this);          
      }
    }

    public function otherMethod() {
        echo "test";

    }     

}


$obj_foo = new foo();
$obj_foo->doloop();//must output '150<br>150<br>150<br> .....
$obj_foo->evalcode_001();
$obj_foo->otherMethod();

但是正如其他人所说,我不想在我的真实脚本中使用类似的东西

【讨论】:

  • 您好,感谢您的示例代码!然而,评估代码需要能够访问各种类属性/方法,所以 $this 必须是可访问的。有没有比使用 create_function 更好的方法?
  • @user2022678 我已经编辑了代码。您现在可以使用$this
  • 太棒了!现在似乎可以工作了:-) ..small 附加问题,是否还有一种方法可以访问私有属性,因为现在仅适用于公共属性?再次感谢!
  • @user2022678 我真的不知道,但可能不可能
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多