我可以在变量上堆叠函数吗?

时间:2014-07-29 01:30:14

标签: php

在变量上堆叠函数是否有问题。它似乎有效,但这样做有潜在的风险或问题吗?

$username = mysql_real_escape_string(strtolower($_POST['username']));

我真的没有看到它的问题,但我对PHP相对较新,我不确定这是否会导致问题。与:相比:

$username = $strtolower($_POST['username']);
$username = mysql_real_escape_string($username);

只是想知道这是否是最好的方法。

2 个答案:

答案 0 :(得分:3)

像你提议的那样,mysql_real_escape_string(strtolower($value))这样的嵌套函数没有问题。它可以使代码易于阅读和理解。我会警告不要过分使用它,然后嵌套许多函数,因为它很快就会变得难以理解。

但等等!!!

不要试图嵌套一切。某些功能需要良好的错误检查才能有效使用。与查询和获取相关的mysql_*()函数应该嵌套(actually they should not be used at all,而是使用MySQLi或PDO)。在您尝试的情况下嵌套字符串函数是非常安全的,但请始终查看http://php.net处的手册以确保您正在嵌套的函数的可能返回类型。特别注意函数that return resources,例如处理数据库连接,文件句柄,套接字等的函数。

// Don't do this:
// mysqli_query() will return false on failure, which will 
// not be a valid argument to mysqli_fetch_array()
$row = mysqli_fetch_array(mysqli_query($conn, "SELECT * FROM tbl"));

如果查询失败,则会导致代码出现致命错误,因为传递给最外层函数的对象不是预期的类型。

相反,像这样的情况需要进行错误检查,使嵌套变得不切实际:

$result = mysqli_query($conn, "SELECT * FROM tbl");
if ($result) {
  $row = mysqli_fetch_array($result);
} 

需要警惕的另一个案例是函数which expect references as their arguments。例如,array_merge()会返回一个数组,但sort()需要对数组的引用(因为sort()没有返回数组,所以无论如何都不会这样做):< / p>

sort(array_merge([3,2,41], [5,1]));
// PHP Strict standards:  Only variables should be passed by reference in php shell code on line 1

实际上相关且更可能的用例是将函数返回值传递给empty()(这在技术上是语言构造而不是函数)。在PHP 5.5之前,只能传入变量,因此以下内容会导致解析错误:

// Error in PHP < 5.5
if (empty(func_returning_string()) {}

答案 1 :(得分:1)

是的,根据需要堆叠尽可能多的函数调用。你的例子不会起作用,因为你错过了一个正确的paren