【问题标题】:Easiest way to set a PHP CONSTANT in 1 file and access it everywhere?在 1 个文件中设置 PHP CONSTANT 并在任何地方访问它的最简单方法?
【发布时间】:2011-01-06 22:25:18
【问题描述】:

我之前也问过类似的问题,但这里有一个完整的演示示例代码。在 PHP 中,如何访问在配置文件中设置然后包含到每个页面中的常量值,包括类文件

我意识到这是某种范围问题,那么在下面的类文件中访问此常量而不在创建对象时将常量传递给对象的最佳方法是什么?

现在,我的类文件认为 CoONSTANT DEBUG var 设置为 true,即使它是 false。它仍然显示真或假,我需要让它只在常量设置为真时才起作用,有什么想法吗?

设置常量值的示例配置文件

<?PHP
//config.inc.php  
define('DEBUG', false);

echo 'config file loaded <br /><br />';

// load class file here
include 'some_class.php';
?>

我们的类文件试图访问上面配置文件中设置的常量

<?PHP
//some_class.php

class Test{

    public function __construct()
    {
        echo 'some_class has been ran <br /><br />';

        if ( defined( 'DEBUG' ) )
        {
            echo 'DEBUG Constant is vissible inside our class file now!!!!! <br /><br />';
        }
    }

}
?>

我们的测试页面将所有内容放在一起

<?PHP
//any-file.php

include 'config.inc.php';

if(DEBUG){
    echo 'DEBUG Constant is vissible inside our Regular file, this is normal and always happens without any trouble though <br /><br />';
}

$test = new Test;
?>

【问题讨论】:

  • 问题已更新为更好的代码示例

标签: php class scope


【解决方案1】:

使用defined 检查常量是否已定义,而不是访问其值:

if ( defined( 'DEBUG' ) )
{
    // debug commands here
}

要禁用调试模式,只需取消注释define 行,这样常量就再次未定义。

【讨论】:

  • 这是一个范围问题,而不是如何检查它
  • 当你之前没有在文件中包含配置文件时,引用DEBUG时会出错,因为它没有定义(因为类是单独访问的什么的)。但是当你检查它是否被定义时,你不会得到一个未定义的错误,只要你在类文件之前包含配置文件,一切都会工作。
  • 我刚刚用完整的源代码示例更新了我的问题,但它似乎没有按我需要的方式工作,有什么想法吗?
  • 你期待什么结果?我复制了整个代码并自己测试了它,所以这里有一些你可能不想要的东西:在any-file.php 中,调试文本没有打印出来,因为DEBUG 是错误的。打印类中的调试文本是因为您只检查已定义(也不检查值)。你得到了致命错误,因为你试图回显一个对象实例(这是不可能的,因为那个对象不是一个字符串)。
  • 对不起,结束回声部分,我在发布时添加了该部分,我删除了该部分。好的,在我的配置文件中,我希望能够将 DEBUG 常量设置为 true 或 false,如果它是 true,那么它应该在类中运行代码,如果 false 那么它将跳过那部分
【解决方案2】:

大多数框架通过成为整个网站的中心控制点来实现这一点。如果您的 Web 应用程序不是集中式的,那么您将没有集中式配置文件,也无法集中访问配置。

当您使用define() 函数定义某些内容时,它是在全局命名空间中定义的,因此从那时起包含的任何 PHP 文件都可以访问它。这不是最好的情况,因为在 define() 语句运行之后,所有依赖于该常量的代码都被包含在内。

【讨论】:

  • 好吧,如果您认为使用常量不是最好的主意,您将如何将站点设置为调试模式并能够在任何文件、类中看到它。方法?
  • 这真的取决于你的需求和框架。例如,如果您使用 Code Igniter,您可以设置一个调试常量并根据需要或基于 url 切换它。如果您没有使用框架并且没有公共入口点,则始终可以扩展一个基类,该基类读取您的配置信息并具有您可以使用的属性,或者您可以拥有必须包含的先决条件列表每一页。
【解决方案3】:

在包含文件中定义一个返回常量值的函数?

【讨论】:

    猜你喜欢
    • 2011-02-20
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2021-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多