【问题标题】:Custom variable which can be used on each page like super globals?可以像超级全局变量一样在每个页面上使用的自定义变量?
【发布时间】:2012-09-06 15:53:54
【问题描述】:

我希望一个变量是超全局的,但由于我使用的是程序风格,我认为我不能自己制作一个,所以基本上问题是我使用查询从安全中检索我的网站的所有安全控制表,正在检查 维护模式 是否开启/关闭,如果开启,则将其重定向到维护页面下的网站,因此在每个页面上我需要检查变量 $maintenance_status 的状态,以便执行此操作,我需要在每个页面上调用该查询,否则会收到未定义变量的错误,此外,如果正在创建一个函数并将该函数文件包含在其他页面中,它会向我显示$db_connect(这是我的数据库连接变量)未定义,我的页面包含在这个序列中

include_once('connection.php');
include_once('functions.php');
 /*other scripts goes here*/

知道如何在每个页面上提取此状态吗?我想为常见查询创建一个新文件,但它是一个干净的解决方案吗?此外,我想我不理解包括,如果我在functions.php 之前包含connection.php,那么为什么我的functions.php 显示未定义的变量$db_connect

【问题讨论】:

    标签: php mysql server-side-includes superglobals


    【解决方案1】:

    您可以通过使用 define() 来使用常量。每次脚本执行可以设置一次定义,并且在一次脚本执行期间不能更改。它们是超全局的 - 也跨被包含的文件。

    http://php.net/define 或只是

    define('MY_CONSTANT', 'whatever');
    define('MY_OTHER_CONSTANT', false);
    
    function foo() {
        if (MY_OTHER_CONSTANT !== true) {
            echo MY_CONSTANT;
        }
    }
    
    foo();
    

    【讨论】:

    • 好吧,我会定义常量,但如果我在函数页面上定义它,我会发现我的文件没有与我的数据库连接,我已经指定了包含,如果我在我无法将其包含到其他页面,我在这里唯一能做的就是将其定义为我的连接文件
    • 感谢您的回答,但我需要将 mmy db_connect 作为全局变量,现在我只是在每个页面上调用函数,我只能将 1 个答案标记为 imp,尽管我会支持你的:)
    • 实际上,您的数据库需要一个静态单例类。 :)
    【解决方案2】:

    如果没有更多的代码上下文来说明您在文件中的哪个位置遇到错误,就很难提供任何建议。例如,您对 $db_connect 的引用是从函数内部完成的吗?如果是这样,除非您在该函数中有 global $db_connect 声明(在全局范围内使用 $db_connect 而不是函数范围内未定义的 $db_connect),否则它将无法工作。

    虽然出于多种原因我不喜欢在函数中使用这样的global 声明(我宁愿使用依赖注入,或者通过静态单例函数调用获取数据库连接),但这可能是另一个教训时间。

    无论如何,您可能最好在某种初始化脚本中进行查询(例如在您的 connection.php inlcude 之后)并定义一个关于是否打开或关闭维护模式的常量。像这样的

    // assuming you have already made DB query and have a value of true/false on a variable called $is_maint_mode
    define('MAINT_MODE', $is_maint_mode);
    

    这会给你一个常量MAINT_MODE,你的代码全局可用。

    【讨论】:

    • 宾果游戏,我将 $db_connection 定义为全局并且它可以工作,顺便说一句,您建议我不应该使用全局,但在这里,我的连接变量是全局的,我想这很好吗?无论如何,我很快就会将我的 db_connection 更改为常量
    • 实际上,正如我所说,我不能使用常量,因为如果我使用常量,那么我可以在连接或我的功能页面上调用查询,因为这些是我包含的唯一两个页面,无论如何我创建了一个函数,在该函数中调用了一个查询,使我的数据库连接变量成为全局变量,并返回值并使用if(maintenance_status() == off) {//then do something} 将其与字符串进行比较,谢谢,这两个答案都有帮助,但使用全局这个词解决了我的函数错误..
    • @V413HAV DB 连接句柄不能存储在常量中。但是,您可以将诸如维护模式开/关值之类的内容存储在常量中。我只是说我通常不喜欢在函数中使用global $variable 类型声明。我通常会使用依赖注入(将变量作为参数传递),或者使用 DB 连接单例,然后从函数中调用像 db::connect() 这样的静态方法来获取函数中的 DB 连接句柄。但是既然你说你主要是在做程序,最后一个解决方案可能不适合你。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    相关资源
    最近更新 更多