2013-08-20 43 views
-1

我正在爲我的基於PHP的文件管理器創建搜索功能。我得到這個錯誤:開捕致命錯誤:類封閉的對象不能轉換爲字符串'上以下行: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查詢的一部分。 $ beginning_files根據用戶是否輸入名稱或之前匹配的任何內容來決定是否在開始處放置'OR'或'AND'。我有一種感覺,我不允許在三元表達式中包含匿名函數,但是我應該怎麼做呢?

謝謝!

+1

'function(){$ begun_files = true;返回「」; })。'size''---這個表達式執行的結果會是什麼? (一秒鐘 - 你連接了一個匿名函數和一個字符串) – zerkms

+2

是否有一個原因,爲什麼一切都必須在一條線上? –

+1

@傑克:它更高性能 – zerkms

回答

0

您不能使用匿名函數進行內聯流量控制;只需使用一個普通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) 
); 
} 
+0

哇。以前從未使用過sprintf(),但它看起來非常有用。我認爲當我發佈代碼的時候,我發佈了錯誤的(但類似的代碼),但是我最終還是寫了一些類似於你寫的東西,謝謝! – sableguy00

0

大樓取消了原來的答案,我結束了這個打算的:

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; 
} 

謝謝!