2011-02-14 178 views
0

我試圖理解這個代碼,我不能:(PHP - 創建函數問題

$time = date('Y-m-d', strtotime('-30 days')); 
$what = create_function('$a', 'return $a.'.'"'." AND date > '$time'".'"'.';'); 

爲什麼$time變量得到這個創建的函數順利通過,但是當我嘗試:

$limit = 10; 
$what = create_function('$a', 'return '.'"'." LIMIT '$limit'".'"'.';'); 

$limit

PS:如果我嘗試$what = create_function('$a', 'return '.'"'." LIMIT 10".'"'.';');它的工作原理...

+0

你一定錯過了一些東西 - 據我所知,它應該像你期望的那樣工作。 – troelskn 2011-02-14 13:23:03

+1

要100%確定你可以試試:`'return'「LIMIT'。$ limit。'」;'`。請注意,在LIMIT後面的數字後面不應加引號(在SQL中),使得字符串連接和引用狂妄更簡單;)(但即使不連接「$ limit」,第一個和第最後的連接是多餘的:`'return''。'LIMIT'$ limit'「。'」;'`) – 2011-02-14 13:26:44

+0

`'。'在附加字符串時,在引號內沒有任何意義。 – powtac 2011-02-14 13:31:26

回答

2

的代碼可以大大簡化:

$what = create_function('$a', "return \"LIMIT $limit\";"); 

$what = create_function('$a', 'return "LIMIT ' . $limit .'";'); 

的代碼應該工作。請注意,LIMIT之後的數字不能用SQL語法中的引號括起來。

但是當你創建了一個功能,你也可以通過$limit作爲參數傳遞給函數:

$what = create_function('$limit', 'return "LIMIT $limit";'); 
$str = $what(10); 

或不使用create_function可言,只是做字符串連接直接:

$str = 'LIMIT ' . $limit; 
1

在你的例子中,很難閱讀和區別'"

試試這個:

$what = create_function('$a', "return \"LIMIT $limit;\""); 

除了

$what = create_function('$a', 'return \'LIMIT $limit;\''); 

或者

$what = create_function('$a', 'return "LIMIT '.$limit.';"'); // most clear, I think 

您可以使用\作爲逃避的性格,這意味着在此之後的下一個字符將不是如果它是當前引用字符,則將其解釋爲結束引用。

實施例:

echo '\''; // will output ' 
echo '\"'; // will output \" 
echo "\""; // will output " 
1

我剛測試了第二代碼,和它的工作,正確地傳遞在$limit

<?php 
$limit = 10; 
$what = create_function('$a', 'return '.'"'." LIMIT '$limit'".'"'.';'); 
echo $what(2);// note: `2` was randomly chosen, and used because $what expects an argument 
// result: ` LIMIT '10'` 
?> 

上面$what線可以被重寫爲:

$what = create_function('$a', 'return "' . " LIMIT '$limit'" . '";'); 

請注意,您不會意外地將其寫爲(注意「圍繞$limitË字符:

$what = create_function('$a', 'return "' . ' LIMIT "$limit"' . '";'); 

在這種情況下,$limit沒有得到由10(的$limit值)取代。

1

首先,我想知道你爲什麼使用create_function?如果有機會(通常有),你應該儘量避免它,因爲這通常導致代碼非常潦草。

我注意到的第一件事是,你的第二個例子不$a做任何事情:

$what = create_function('$a', 'return '.'"'." LIMIT '$limit'".'"'.';'); 

大概應該是:

$what = create_function('$a', 'return $a . '.'"'." LIMIT '$limit'".'"'.';'); 

此外,連接字符串時,嘗試環繞用空格表示.。它會使你的代碼更具可讀性(因此也是可調試的)。最後,去容易在雙和單引號:)

2

當你連接字符串時,你的代碼似乎有點凌亂,請嘗試更簡單的方法:

create_function('$a', sprintf('return "LIMIT %d"',$limit)); 

如果你不介意我問,爲什麼你創建一個函數來返回一個簡單的字符串?

0

在create_function中,$limit用單引號括起來;或者應將其包含在雙引號("LIMIT $limit")中或使用連接(.)運算符(如下所示:'".$limit."')。