【问题标题】:php Object of class Closure could not be converted to string类 Closure 的 php 对象无法转换为字符串
【发布时间】:2013-08-22 00:24:12
【问题描述】:

我正在为我的基于 PHP 的文件管理器创建一个搜索功能。我收到此错误:“可捕获的致命错误:无法将类闭包的对象转换为字符串”:

if ($data->input_ext)
{
    $data_ext = ($begun ? ($data->input_logic ? ' OR ' : ' AND ') :
    function ()
    {
        $begun = true;
        return "";
    }) . 'ext = "' . $data->input_ext . '"';
    $data_string.= $data_ext;
}

这是构建 SQL 查询的一部分。 $begun_files 只是根据用户是否输入名称或在此之前的任何内容来匹配是否将“OR”或“AND”放在开头。我有一种感觉,我不允许在三元表达式中包含匿名函数,但我应该怎么做呢?

谢谢!

【问题讨论】:

  • function() { $begun_files = true; return ""; }).'size ' --- 执行此表达式会得到什么结果? (一秒钟 - 你正在连接一个匿名函数和一个字符串)
  • 所有内容都必须在一行上是否有原因?
  • @Jack:性能更高
  • @zerkms 啊,对,这就解释了 :)
  • 对不起,我就是这么写的。我已经对代码进行了一些更改,但我仍然遇到同样的问题。我会重新发布它,格式化。

标签: php closures anonymous-function ternary-operator


【解决方案1】:

在上一个答案的基础上,我最终选择了这个:

if ($data->input_ext) { 
    if ($begun) { $logic = $data->input_logic ? ' OR ' : ' AND '; } else { $logic = ""; $begun = true; }        
    $data_ext = $logic.'ext = "'.$data->input_ext.'"'; $data_string .= $data_ext;
}

if ($data->input_size) { 
    if ($begun) { $logic = $data->input_logic ? ' OR ' : ' AND '; } else { $logic = ""; $begun = true; }
    $data_size = $logic.'size '.($data->input_size_op ? '<=' : '>=').' '.($data->input_size * pow(1024,$data->input_size_unit)); $data_string .= $data_size;
}

谢谢!

【讨论】:

    【解决方案2】:

    您不能将匿名函数用于内联流控制;只需使用常规的 if 语句,不要回避在多行上写东西:

    if ($data->input_size) {
      if ($begun_files) {
          $str .= $data->input_logic ? ' OR ' : ' AND ';
          $begun_files = true;
      }
      $str .= sprintf('size %s "%f"',
          $data->input_size_op ? '<=' : '>=',
          $data->input_size * pow(1024,$data->input_size_unit)
      );
    }
    

    【讨论】:

    • 哇。以前从未使用过 sprintf() 但它看起来真的很有用。我想当我重新发布代码时,我发布了错误的代码(但类似的行),但我最终得到了类似你写的东西,所以谢谢!
    猜你喜欢
    • 2016-11-16
    • 2013-02-28
    • 1970-01-01
    • 2021-11-10
    • 2023-04-06
    • 2015-02-05
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    相关资源
    最近更新 更多