PHP如何防止foreach覆盖外部变量

问题描述 投票:0回答:2

目前,我正在尝试清理我工作的公司网站上尽可能多的代码,而不是完全重写(例如删除诸如

// 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个不同的变量名或移动代码吗?

php foreach block
2个回答
1
投票

正如 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


0
投票

在文件 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

© www.soinside.com 2019 - 2024. All rights reserved.