目前,我正在尝试清理我工作的公司网站上尽可能多的代码,而不是完全重写(例如删除诸如
// declare variables
之类的愚蠢评论,干净的变量命名,一致性等)。该代码非常混乱且糟糕,使用了很多包含在内的文件,并且在文件之间使用了变量,这使得它非常烦人。
问题是,重命名变量这样简单的事情实际上可能会造成很多问题。我目前遇到以下问题:
在文件中
a
我有一个查询,看起来像这样:
$getProductSql = 'QUERY';
$getProduct = $db->prepare($getProductSql);
// some bind values etc.
$getProduct->execute();
$product = $getProduct->fetch(PDO::FETCH_ASSOC);
现在,在该文件包含在索引中之后,文件
b
将被包含其中,其中包含以下内容:
$getProductsSql = 'QUERY';
$getProducts = $db->prepare($getProductsSql);
// some bind values etc.
$getProducts->execute();
foreach ($getProducts->fetchAll(PDO::FETCH_ASSOC) as $product) {
// some code
}
包含该文件后,将包含文件
c
,其中包含以下内容:
if ($product['COLUMN'] === '1')
在文件
c
中,应该使用文件 $product
中的 a
变量,但由于我们的结构以及文件 b
包含在中间,文件 $product
中的 a
被替换为最后一个文件 $product
中循环的 b
值。
有什么方法可以解决这个问题而不使用2个不同的变量名或移动代码吗?
正如 deceze 所说:实际上没有......但你可以这样做:
将文件 a 保留原样。
像这样更改文件b:
$getProductsSql = 'QUERY';
$getProducts = $db->prepare($getProductsSql);
// some bind values etc.
$getProducts->execute();
$p[] = $product;
foreach ($getProducts->fetchAll(PDO::FETCH_ASSOC) as $product) {
// some code
$p[] = $product
}
$product = $p;
文件 c 像这样:
if ($product[0]['COLUMN'] === '1')
这有点令人困惑,而且不太好。是的,这就是为什么你应该使用函数......
或者:如果您在文件 c 中不再需要文件 b 中的产品数组,您也可以简单地执行以下操作:
文件b:
$getProductsSql = 'QUERY';
$getProducts = $db->prepare($getProductsSql);
// some bind values etc.
$getProducts->execute();
$p = $product;
foreach ($getProducts->fetchAll(PDO::FETCH_ASSOC) as $product) {
// some code
}
$product = $p;
在这种情况下:无需更改文件 c
在文件 b 中,你的问题似乎没有生成任何新数据——它只是执行操作。
要锁定任何新变量并防止更改先前声明的变量,请使用立即调用函数表达式并显式
use
任何所需变量。
function($db, $v1 $v2) {
$sql = 'QUERY';
$stmt = $db->prepare($sql);
$stmt->execute([$v1, $v2]);
foreach ($stmt as $row) { // don't fetchAll inside a foreach
// some code
}
})($db, $var1 $var2);
如果你想改变,比如说,
$var1
并访问 IIFE 之外的更新值,那么你可以写:
function() use ($db, &$var1 $var2) {
如果你想从 IIFE 返回一个值,你可以这样写:
$iifeResult = function() use ($db, $var1 $var2) {
$sql = 'QUERY';
$stmt = $db->prepare($sql);
$stmt->execute([$var1, $var2]);
$result = [];
foreach ($stmt as $row) {
// some code
$result[] = $row;
}
return $result;
})();
单行 IIFE 可以享受箭头函数语法的简洁性,通过值访问全局范围的变量而无需
use
并返回一个值。
$radius = 2;
$circumference = (fn($pi) => $pi * $radius ** 2)(pi());
查看此沙盒演示中的一些变化:https://3v4l.org/4RRGV