【发布时间】:2012-05-28 07:36:08
【问题描述】:
定义全局常量的最佳方法是什么,即在所有 PHP 文件中都可用?
更新:常量和类常量有什么区别?它们可以互换使用吗?
【问题讨论】:
标签: php variables global-variables constants
定义全局常量的最佳方法是什么,即在所有 PHP 文件中都可用?
更新:常量和类常量有什么区别?它们可以互换使用吗?
【问题讨论】:
标签: php variables global-variables constants
在您的 top .php 文件中定义您的常量,该文件将包含在所有其他脚本中。它可能是您的前端控制器、您的配置文件或为此单一目的而创建的文件。
!defined('MY_CONST') && define('MY_CONST', 'hello');
【讨论】:
defined('CONST_NAME') || define('CONST_NAME', 'value');
这取决于。在您的情况下,我会选择define(),因为它的语法更紧凑。但是define() 只能在 PHP $GLOBALS 或使用 PHP >=7.0。
// Storing a single value works fine with define
define( 'ROOT_DIR', dirname(dirname(__FILE__)) . '/' );
// But not for complex data types like this array
$USERPIC_PARAMS = array(
"user_root" => "images/users",
"padding_length" => 8,
"split_length" => 4,
"hash_length" => 12,
"hide_leftover" => false
);
// Then you need $GLOBALS
$GLOBALS['USERPIC_PARAMS'] = $USERPIC_PARAMS;
// Or in PHP >=7.0
define( 'USERPIC_PARAMS', $USERPIC_PARAMS );
// output your define
echo ROOT_DIR;
// output your $GLOBALS var
echo $GLOBALS['USERPIC_PARAMS'];
// output in PHP >=7.0 your constant
echo USERPIC_PARAMS;
【讨论】:
当你想跨 PHP 文件使用全局常量时,我觉得一个好的做法是使用面向对象的原则并在相关类中定义这些。使用 PHP 内置的 spl_autoload_register() 函数,您可以定义所有以后的类来扩展相关的“全局类”,而不必担心在任何地方手动包含文件。该全局类的所有后续子类将始终可以访问相关的全局变量。 (我说相关是因为让一个类中的全局常量以某种方式相关是一种很好的设计,而不是所有东西都没有押韵或理由地组合在一起)
【讨论】:
更好的方法是检查常量是否被分配给任何东西,如果它没有被分配给任何东西然后分配它,否则将它分配给 NULL 然后将它分配给你的常量
defined("FOO") ? null : define("FOO", "BAR");
【讨论】:
检查一下
<?php
//Global scope variables
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
【讨论】:
无论您在哪个文件中创建常量,您都必须在将使用它们的文件中要求/包含它。
否则,您可以使用 $_SESSION 全局变量,但这需要在每个文件的代码开头由session_start() 进行会话初始化。
【讨论】:
执行以下操作:
define("CONSTANT_NAME","value");
如果你想从其他 php 文件中访问这个常量,你必须包含它:
include_once("thefilewiththeconstant.php");
【讨论】: