【问题标题】:custom super global in PHPPHP中的自定义超级全局
【发布时间】:2011-12-07 10:36:20
【问题描述】:

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

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

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

【问题讨论】:

  • 您可能必须将其编译到 PHP 源代码中。
  • 简答; 没有。更好的答案;您可以在 $_ENV 中创建自己的元素,这是我观察到的常用方法。
  • 还有;也许类答案(因为显然已删除)不是您想要的,但它是一个可行的解决方案。使用某种注册表模式可能会为全局数据管理提供最强大的接口。
  • 我知道,这就是我正在使用的东西(配置的单例实例,例如),尽管我的问题不是要求最好的方法来做到这一点。这实际上是一个“如果可能”的问题。不过,感谢您的建议。

标签: php


【解决方案1】:

一个可以用作超全局变量的小技巧,它是一个类似于单调的实现,但我同意@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;
    }
}

然后你可以在所有方法、类、函数中使用它,就像一个超全局变量。

K::I()->CONST[0] = "somevar";
K::I()->CONST[1] = array(1, 2, 3, 4, 5);

【讨论】:

  • 不应该是K::I() 而不是K::I 吗?
【解决方案2】:

这是不可能的,也是糟糕的设计。 (和超级全局变量一样)。

如果您确实认为全局状态是您的答案,您可以使用静态类。

【讨论】:

    【解决方案3】:

    我并没有为此问题提供解决方案,但我建议您避免使用全局变量。一般来说,使用全局变量被认为是不好的做法,即使在通过设计使用它们的编程语言中也是如此。您无法确定您的全局变量将如何影响声明相同变量的其他应用程序。就个人而言,我更喜欢一种更受管理的方法来检索数据,特别是从另一个 php 脚本或通过编写定义新函数并返回所需数据的 php 扩展。将应用程序设置存储在数据库中并不罕见,无论是 MySQL 还是平面文件文本,这将是我跨应用程序共享信息的首选方法。

    【讨论】:

      【解决方案4】:

      遗憾的是没有办法定义超全局变量。

      (PHP 中没有针对用户定义的超全局变量的机制。)

      Source

      【讨论】:

      • “(PHP 中没有用于用户定义的超全局变量的机制。)”(来自 RCE 给出的源代码)我不知何故忽略了它。谢谢。
      【解决方案5】:

      对不起,所有答案都是错误的。 正确答案:是的,这是可能的,但不是所谓的“核心”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

      【讨论】:

        【解决方案6】:

        我的解决方案

        真的 php 不支持定义更多的超全局变量,但是如果你想在不同的用户和会话之间共享变量,我的解决方案是创建一个唯一的会话来保存共享信息。该过程包括关闭当前会话,打开共享会话以写入和读取并返回到上一个会话。

        代码:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-08-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多