关于全局变量的PHP基本问题

jgwigjjp  于 2023-09-29  发布在  PHP
关注(0)|答案(2)|浏览(135)

我有一个第一个函数,我用来定义一个变量:

function calculation() {
        return min(0, 150, 30, 20, -8, -200);
}

$mycalculationresult = calculation();

我想在许多其他函数中使用$mycalculationresult。
我知道的一种方法是在每个函数中添加:

function parent_function() {
        global $mycalculationresult;
        // code
}

我读到最好避免全局变量,所以我可以使用第二种解决方案。

function parent_function($mycalculationresult) {  
        // code
        child_function($mycalculationresult);
}
function child_function($mycalculationresult) {
        // code
}

它可能更安全(我不知道),但它不实用。

建议的解决方案是什么?
**有没有一种方法可以避免在每个需要的函数中“调用/定义”$mycalculationresult?**我知道在WordPress上$post_id是在核心文件中定义的,我不必在我创建的每个函数中定义它。

zlwx9yxi

zlwx9yxi1#

如果你想在PHP中的函数中使用一个变量,并且该变量是在函数外部定义的(并且该场景不涉及类-有关详细信息,请参阅this answer),基本上你有两个选择:
1.将变量作为输入参数传递给函数:

function calculation() {
  return min(0, 150, 30, 20, -8, -200);
}

function anotherFunction($val)
{
  echo "Received value $val";
}

$mycalculationresult = calculation();
anotherFunction($mycalculationresult);

演示:https://3v4l.org/KTGmJ
1.使用全局变量

function calculation() {
  return min(0, 150, 30, 20, -8, -200);
}

function anotherFunction()
{
  global  $mycalculationresult;
  echo "Value is $mycalculationresult";
}

$mycalculationresult = calculation();
anotherFunction();

演示:https://3v4l.org/I2iSa
这些事情总是开放的解释,但在大多数情况下,选项1应该是你的默认选择。它往往会导致代码更容易理解,更容易测试,更不容易出现意外的错误-特别是在较大的代码库中。使用全局变量是可行的,偶尔也会有帮助,但是当你开始进行更改时,出现不可预见的问题的可能性更大,因为变量的范围远没有那么有限或清晰。

sirbozc5

sirbozc52#

安全性只是你不想使用太多全局变量的部分原因。将变量作为函数的参数也清楚地向您展示了函数所依赖的内容,并且它允许您更容易地重用函数,这毕竟是函数背后的整个思想。
很多PHP代码都是用using classes编写的。你的wordpress example可能正在使用这个。对象使得同时封装变量(=属性)和函数(=方法)成为可能。
为了用一个模拟计算器类来说明这一点,使用您的示例:

class Calculator
{
    public $result;
    
    public function __construct($initialResult = 0)
    {
        $this->result = $initialResult;
    }

    public function lowestOfTwoValues($value1, $value2) 
    {
        $this->result = min($value1, $value2);
    }

    public function lowestOfManyValues($values) 
    {
        foreach ($values as $value) {
            $this->lowestOfTwoValues($this->result, $value);
        }
    }

}

$calculator = new Calculator();
$calculator->lowestOfManyValues([0, 150, 30, 20, -8, -200]);
echo $calculator->result;

演示:https://3v4l.org/3QaZj
注意$result不是每个方法的参数,而是类的属性。你可以说它是类内部的全局变量。
这个类的例子并不完美,它只是为了说明我上面提出的观点。你能找到窃听器吗?

相关问题