定义全局常量(即在所有 PHP 文件中可用)的最佳方法是什么?
更新: 常量和类常量有什么区别?它们可以互换使用吗?
在 top .php 文件中定义常量,该常量将包含在所有其他脚本中。它可能是您的前端控制器、您的配置文件或为此单一目的创建的文件。
!defined('MY_CONST') && define('MY_CONST', 'hello');
执行以下操作:
define("CONSTANT_NAME","value");
如果你想从其他 php 文件访问这个常量,你必须包含它:
include_once("thefilewiththeconstant.php");
当您想在 PHP 文件中使用全局常量时,我觉得一个好的做法是使用面向对象原则并在相关类中定义它们。使用 PHP 中内置的 spl_autoload_register() 函数,您可以定义所有后续类来扩展相关的“全局类”,而不必担心在任何地方手动包含文件。该全局类的所有后续子类将始终可以访问相关的全局变量。 (我说相关是因为让类中的全局常量以某种方式相关是很好的设计,而不是将所有内容无缘无故地组合在一起)
检查这个
<?php
//Global scope variables
$a = 1;
$b = 2;
function Sum()
{
global $a, $b;
$b = $a + $b;
}
Sum();
echo $b;
?>
更好的方法是检查常量是否分配给任何东西,如果没有分配给任何东西,则分配它,否则将其分配给 NULL,然后将其分配给您的常量
defined("FOO") ? null : define("FOO", "BAR");
这要看情况。在你的情况下,我会选择
define()
,因为它在使用中具有更紧凑的语法。但是 define()
只能在 PHP < 7.0 In case you need i.e. an associative array you have no other choice then to go for $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;
无论您在哪个文件中创建常量,您都必须在要使用它们的文件中要求/包含它。
否则,您可以使用 $_SESSION 全局变量,但这需要在每个文件的代码开头通过
session_start()
进行会话初始化。
defined("FOO") ?? define("FOO", "BAR");
最快最短的路线: