eval()不返回函数结果

时间:2013-07-16 08:57:44

标签: php eval

我有一个方法名称,存储在DB中的一列中,如下所示:

customs::nicknames($data)

这是相关课程:

    class customs extends service {

    function __construct() {
        parent::__construct();
    }

    public static function nicknames($data) {
        return $data;
    }

}

当我以这种方式打电话时:

$merge = eval($error['custom'] . ';');

不返回$ data变量的内容。 只是尝试一下我尝试使用echo并正确地将数组返回到字符串转换php错误。 因此,正确读取变量$data。但为什么不返回任何东西?

如果我试图在不使用eval()的情况下调用此方法,请执行以下操作:

$merge = customs::nicknames($data);

正确返回$data

那有什么不对?

为什么eval()无法返回方法结果?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:18)

  

为什么 eval()无法返回方法结果?

只是因为你没有在eval部分退回任何内容。

  

Docs:

     

eval() 返回NULL,除非在评估的代码中调用 return ,在哪种情况下,返回传递给 return 的值。


  

我该如何解决这个问题?

您可以在eval中指定变量(在给定示例中为$merge)。例如:

eval('$merge =' . $error['custom'] . ';');
return中的

eval值。 E.g:

$merge = eval('return '.$error['custom'].';');

注意:请勿在实际应用中使用eval

  

Warning from docs:

     

eval() 语言构造 非常危险 ,因为它允许执行任意PHP代码。 因此使用它   气馁。 如果你仔细确认没有其他的   选项比使用此构造,特别注意 不要通过   任何用户都没有正确验证数据   预先。


  

如果 eval()是危险的,还有另一种方法可以安全地将字符串作为代码读取吗?

是的,有(实际上是):

  1. PHP是非常动态的语言。它可以使用strings执行以下操作:

    • 定义和/或获取变量(从PHP 4.3支持)。例如:

      $variableName = 'MyVariable';
      // Create new variable with the name defined in variable $variableName
      ${$variableName} = 'MyValue';
      //Outputs: string(7) "MyValue"
      var_dump($MyVariable);
      //Outputs: string(7) "MyValue"
      var_dump(${'MyVariable'});
      

      Demo

    • 调用函数(PHP 4.3支持)。例如:

      // Create function with the name defined in variable $functionName
      function MyFunction($argument) {
          return 'Argument passed is: '.$argument;
      }
      
      $functionName = 'MyFunction';
      
      // Outputs:
      // string(48) "Argument passed is: Calling MyFunction directly."
      var_dump(MyFunction('Calling MyFunction directly.'));
      // Outputs:
      // string(51) "Argument passed is: Calling MyFunction with string."
      var_dump($functionName('Calling MyFunction with string.'));
      

      Demo

    • 创建类的实例(从PHP 5.0支持)。例如:

      class MyClass {
          public function __construct() {
              echo 'Constructing MyClass'."\n";
          }
      }
      
      $className = 'MyClass';
      
      $objFromString = new $className();
      // Outputs: object(MyClass)#1 (0) {}
      var_dump($objFromString);
      

      Demo

    • 调用静态方法(从PHP 5.0支持)。例如:

      class MyClass {
          public static function staticMethod() {
              return 'MyClass::staticMethod called';
          }
      }
      
      $staticMethodName = 'staticMethod';
      // Outputs: string(28) "MyClass::staticMethod called"
      var_dump(MyClass::$staticMethodName());
      

      Demo

      从PHP 5.3开始,类名也可以用string定义。例如:

      class MyClass {
          public static function staticMethod() {
          return 'MyClass::staticMethod called';
          }
      }
      
      $className = 'MyClass';
      $staticMethodName = 'staticMethod';
      
      var_dump($className::$staticMethodName());
      var_dump($className::staticMethod());
      

      Demo

    • 调用对象的实例方法(从PHP 5.0支持)。例如:

      class MyClass {
          public function instanceMethod() {
              return 'MyClass::instanceMethod called';
          }
      }
      
      $methodName = 'instanceMethod';
      
      $obj = new MyClass();
      // Outputs: string(30) "MyClass::instanceMethod called"
      var_dump($obj->$methodName());
      

      Demo

    • 访问对象的静态和实例属性(从PHP 5.0支持)。例如:

      class MyClass {
          public static $myStaticProperty;
          public $myInstanceProperty;
      }
      
      $staticPropertyName = 'myStaticProperty';
      $instancePropertyName = 'myInstanceProperty';
      
      MyClass::${$staticPropertyName} = 'my static value';
      $obj = new MyClass();
      $obj->{$instancePropertyName} = 'my instance value';
      
      var_dump(MyClass::${$staticPropertyName});
      var_dump($obj->{$instancePropertyName});
      

      Demo

  2. PHP有两个函数:call_user_funccall_user_func_array用于动态函数/方法调用。两者都有完整的记录,所以我不会在这里详细介绍。
  3. 即使上面的所有内容都不够,PHP 5也会提供很棒的Reflection API。遗憾的是,文档中的示例很少,但反思是一个非常大的主题。基本上,在阅读它的工作原理后使用反射并不是什么大不了的事。