2011-02-14 63 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."')。