你能将一个面向对象的代码放入一个变量吗?

时间:2017-03-13 20:35:29

标签: php

我想让一段代码可以重复使用,并希望使用面向对象的代码来完成它。

有没有办法以任何方式'插入'面向对象的代码? (看下面我的例子,看看我的意思)

class Insert {
    function insert_test($a, $b) {
          return  $a.$b;
    }
}
$Insert = new Insert();

$insertplugin = "$Insert->insert_test('abc', '123')"; // the plugin of object oriented code
include_once("reusablecode.php");


reusablecode.php:

$something =1;
if($something >0)
{
    $insertplugin;
}

1 个答案:

答案 0 :(得分:3)

技术上可以,你可以调用eval($insertPlugin);来运行存储在字符串中的代码。在设置$ insertPlugin变量时,您需要使用单引号来防止$ Insert变量转换为字符串。

然而,这通常被视为邪恶(特别是如果您的代码是根据用户输入构建的)请参见此处:When is eval evil in php?

这取决于你的“插件”中你真正希望改变的是什么样的正确方法。一种方法是创建一个封装所需功能的类。

class Command{
   private $inserter;
   public function __constructor($inserter){
       $this->inserter=$inserter;
   }
   public function run(){
     $this->inserter->insert_test('abc', '123');
   }
}
$command = new Command(new Insert());


$something =1;
if($something >0)
{
    $command->run();
}

另一种方法是使用lambda函数:

$insertPlugin=function() use ($Insert) {

    $Insert->insert_test('abc', '123');
};


$something =1;
if($something >0)
{
    $insertPlugin();
}

听起来你应该在OOP上做更多的阅读 - 我认为你基本上想要的是一个'Command'类http://www.fluffycat.com/PHP-Design-Patterns/Command/特别是使用抽象类来允许你定义多个不同的命令(或你所谓的“插件”)