PHP - 创建函数问题

时间:2011-02-14 13:20:18

标签: php mysql function variables quotations

我正在尝试理解这段代码而我不能:(

$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".'"'.';');它可以工作......

6 个答案:

答案 0 :(得分: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 :(得分:2)

当您的串联字符串时,您的代码看起来有点混乱,尝试更简单的方法:

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

如果你不介意我问,你为什么要创建一个函数来返回一个简单的字符串?

答案 2 :(得分: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 "

答案 3 :(得分: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的值)。

答案 4 :(得分:1)

首先,我想知道您使用create_function的原因?如果有任何机会(通常有),你应该尽量避免使用它,因为这通常导致代码非常粗糙。

我注意到的第一件事是你的第二个例子对$a没有做任何事情:

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

应该是:

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

此外,在连接字符串时,请尝试用空格包围.。它将使您的代码更具可读性(因此,可调试)。最后,在双引号和单引号上轻松一下:)

答案 5 :(得分:0)

在create_function中,$limit是单引号;您应该将其包含在双引号("LIMIT $limit")中,还是使用连接(.)运算符(如下所示:'".$limit."')。