PHP自定义超全局

时间:2011-12-07 10:36:21

标签: php

是否可以定义自定义超级全局变量? (无论是在代码中,还是使用php.ini)

示例,对于我使用自定义框架的所有项目。该框架实质上将关于运行脚本实例(模板加载,模板变量等)的所有数据存储在单个变量中。我希望该变量成为跨系统可访问的。

我完全了解$_GLOBALSglobal,但问题是询问是否可以定义自定义超级全局变量,例如$ foo,可以在任何scop中以相同的名称访问。

6 个答案:

答案 0 :(得分:9)

可悲的是,没有办法定义超全球。

  

(PHP中没有用于用户定义的超全局的机制。)

Source

答案 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的超全局变量。每个会话为颜色文本和计数重新加载定义两个局部变量..

Result my solution