是否可以定义自定义超级全局变量? (无论是在代码中,还是使用php.ini)
示例,对于我使用自定义框架的所有项目。该框架实质上将关于运行脚本实例(模板加载,模板变量等)的所有数据存储在单个变量中。我希望该变量成为跨系统可访问的。
我完全了解$_GLOBALS
和global
,但问题是询问是否可以定义自定义超级全局变量,例如$ foo,可以在任何scop中以相同的名称访问。
答案 0 :(得分:9)
答案 1 :(得分:3)
抱歉,但所有答案都错了。 正确答案:是的,这是可能的,但不是所谓的“核心”PHP功能。 您必须安装名为runkit的扩展: http://www.php.net/manual/en/runkit.installation.php
之后,您可以在php.ini中设置自定义超全局,如下所示: http://www.php.net/manual/en/runkit.configuration.php#ini.runkit.superglobal
答案 2 :(得分:2)
这是不可能的,也是糟糕的设计。 (和超级全局一样)。
如果你认为全局状态是你的答案,你可以使用静态类。
答案 3 :(得分:2)
我没有提供这个问题的解决方案,但我建议你避免使用全局变量。一般来说,使用全局变量被认为是不好的做法,即使在通过设计使用它们的编程语言中也是如此。您无法确定全局将如何影响声明相同变量的其他应用程序。我个人更喜欢一种更管理的方法来检索数据,特别是从另一个PHP脚本或通过编写定义新功能的PHP扩展并返回所需的数据。在数据库中存储应用程序设置并不罕见,无论是MySQL还是平面文件,都是我首选的交叉应用程序信息共享方法。
答案 4 :(得分:0)
可以用作超级球的一个小黑客(技巧),它是一个单一的实现,但我同意@Matt Esch,不要使用超级全局......
class K
{
public $CONST = array();
private static $_instance = null;
private function __construct()
{
}
protected function __clone()
{
}
static public function I()
{
if(is_null(self::$_instance))
{
self::$_instance = new self();
}
return self::$_instance;
}
}
然后你可以在所有方法,类,函数中使用它,就像一个超全局var。
K::I()->CONST[0] = "somevar";
K::I()->CONST[1] = array(1, 2, 3, 4, 5);
答案 5 :(得分:0)
我的解决方案
真的不支持定义更多的超级全局,但如果你想在不同的用户和会话之间共享变量,我的解决方案是创建一个独特的会话来保存共享信息。进程包括关闭当前会话,打开共享会话以进行写入和读取并返回上一个会话。
<强>代码:强>
<?php
ini_set('display_errors',1);
error_reporting(E_ALL);
function get_global($key){
//Get current session
if(session_status()!=PHP_SESSION_ACTIVE)session_start();
$current_id=session_id();
session_write_close();
//Set a global session with session_id=1
session_id(1);
session_start();
//Get superglobal value
$value=null;
if(isset($_SESSION[$key]))$value=$_SESSION[$key];
session_write_close();
//Set the before session
session_id($current_id);
session_start();
return $value;
}
function set_global($key,$value){
//Get current session
if(session_status()!=PHP_SESSION_ACTIVE)session_start();
$current_id=session_id();
session_write_close();
//Set a global session with session_id=1
session_id(1);
session_start();
//Set superglobal value
$_SESSION[$key]=$value;
session_write_close();
//Set the before session
session_id($current_id);
session_start();
}
//Example
//Begin my session normally
session_start();
if(empty($_SESSION['count'])){
$_SESSION['count']=0;
$_SESSION['color']="rgb(".rand(0,255).",".rand(0,255).",".rand(0,255).")";
}
$_SESSION['count']++;
$id=session_id();
//Get the superglobal
$test=get_global("test");
//Set the superglobal test with empty array if this dont set
if($test==null)$test=array();
//Get the superglobal
$test=get_global("test");
//Set values for each reload page and save the session_id that create it
$test[]="<span style='color:".$_SESSION['color']."'>Value: ".rand(0,100)." SessionID: $id</span><br>";
//Save the superglobal
set_global("test",$test);
//Show the superglobal
foreach($test as $t){
echo $t;
}
echo "<b>Reloads = ".$_SESSION['count'].", <span style='color:".$_SESSION['color']."'>This my color</span></b>";
exit;
?>
<强>测试强>
在此示例中,$ test是包含随机数的数组和创建它的session_id的超全局变量。每个会话为颜色文本和计数重新加载定义两个局部变量..