【问题标题】:Initialize Global Variables in PHP在 PHP 中初始化全局变量
【发布时间】:2009-07-23 11:03:16
【问题描述】:

在 PHP 中初始化一个全局变量是个好习惯吗?代码的 sn-p 似乎工作正常,但是在函数外部初始化变量(在更大的项目中,比如为了性能起见)更好,就像在代码的第二个草稿中一样?

if(isset($_POST["Return"]))Validate();
function Validate(){
    (!empty($_POST["From"])&&!empty($_POST["Body"]))?Send_Email():Fuss();
};
function Send_Email(){
    global $Alert;
    $Alert="Lorem Ipsum";
    mail("","",$_POST["Body"],"From:".$_POST["From"]);
};
function Fuss(){
    global $Alert;
    $Alert="Dolor Sit"
};

function Alert(){
    global $Alert;
    if(!is_null($Alert))echo $Alert;
};

注意上面的变量 $Alert 没有初始化。

$Alert;
if(isset($_POST["Return"]))Validate();
function Validate(){
    (!empty($_POST["From"])&&!empty($_POST["Body"]))?Send_Email():Fuss();
};
function Send_Email(){
    global $Alert;
    $Alert="Lorem Ipsum";
    mail("","",$_POST["Body"],"From:".$_POST["From"]);
};
function Fuss(){
    global $Alert;
    $Alert="Dolor Sit"
};

function Alert(){
    global $Alert;
    if(!is_null($Alert))echo $Alert;
};

现在注意了。

感谢任何答案!在此先感谢,杰

【问题讨论】:

    标签: php variables global initialization


    【解决方案1】:

    在第二个示例中,您仍然没有声明变量,即行

    $alert;
    

    没有给$alert赋值,所以它保持未声明。

    如果你先声明变量,你可以更容易地访问它而不会产生通知:

    $alert = '';
    
    if ($alert) {
        //do something with alert
    }
    

    【讨论】:

      【解决方案2】:

      初始化一个 PHP 中的全局变量?

      在我看来(而且我不是唯一一个这样认为的人)不使用全局变量是一种很好的做法。

      你可以找到几个参数here

      如果你真的需要使用全局变量,最好初始化它们;或使用isset 来确定他们是否已经存在。

      【讨论】:

      • 我需要它是全局的,因为每次页面加载时都会调用 Alert(),如果 $Alert 为空,则页面中不会回显任何警报。
      • isset 不是一个好方法,全局变量是即时的,因此全局变量上的 isset 通常返回 null,因为这就是它们的数组位置的初始化方式。
      【解决方案3】:

      嗯,使用未初始化的变量会在php中触发一个通知,所以初始化变量总是比不初始化好。

      【讨论】:

      • 首先感谢大家的快速回复!无论 $Alert 是否存在,我都不会收到通知。那么当 PHP 看到它的第一个实例时,变量是否被初始化,全局或其他(在第一个 sn-p 中,即:第 6 行)?
      • 您可能没有看到通知,因为您还没有打开它们,您可以更改您的 php.ini 以启用它们,或使用以下命令:error_reporting(E_ALL); error_reporting 的默认值往往会随着 PHP 的不同版本而变化(我认为!)。但最好将其设置为 E_ALL,因为您会更清楚自己的编程错误。
      • 正如建议的那样,我已将一小段代码附加到我们已经拥有的代码下方,即使如此我仍然看不到任何错误!错误报告(E_ALL); ini_set("display_errors",1);
      • 另外,error_reporting(E_ALL | E_STRICT) 是最详细的错误级别。
      • 当然,我也尝试过严格,但我仍然没有看到任何错误。即使上传到远程服务器后,我也看不到任何错误!
      【解决方案4】:

      不要使用全局变量,这是一个不好的部分,并且在 PHP6 中不可用。如果您需要跨页面/类可用的值,为什么不创建一个枚举类?在此处查看示例:http://riccardotacconi.blogspot.com/2009/05/enumerator-class-in-php.html

      基本上你包含你的类并且你以这种方式获得值:QYourClass::Alert

      【讨论】:

      • 常量的值不能像定义的全局一样在运行时设置。不管怎样,谢谢你的回答。
      • 对于那些在谷歌上搜索的人来说,PHP6 从未发生过,PHP7 仍然包含 $GLOBALS。
      • 这个答案不成熟。
      【解决方案5】:

      我不认为这是可行的,所以我将其废弃。全局变量在 PHP6 和常量中被删除,根据定义不能改变它的值。感谢大家,感谢每一个回答和所有贡献的人。

      【讨论】:

      • 你的不是答案。你应该把功劳归功于帮助过你的人,如果有的话。否则,请不要选择您的答案,因为我已经在上面某处阅读过。
      【解决方案6】:

      根据this page,PHP6 中并没有废除全局变量,而是注册全局变量。全局变量有很多用途(有些是好的做法,有些不是)并且基本上是安全的。 Register globals 是一个严重的安全漏洞,已被正确弃用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-21
        • 1970-01-01
        • 2022-10-20
        • 2016-10-03
        相关资源
        最近更新 更多