如何从类的函数内部访问全局变量

时间:2016-11-23 10:28:51

标签: php php-5.5

我有档案init.php

<?php 
     require_once 'config.php';
     init::load();
?>

config.php

<?php 
     $config = array('db'=>'abc','host'=>'xxx.xxx.xxx.xxxx',);
?>

名为something.php的小组:

<?php
     class something{
           public function __contruct(){}
           public function doIt(){
                  global $config;
                  var_dump($config); // NULL  
           }
     } 
?>

有人可以告诉我为什么它是空的??? 在php.net,他们告诉我,我可以访问,但实际上不是。 我试过但不知道。 我使用的是PHP 5.5.9。 提前谢谢。

4 个答案:

答案 0 :(得分:4)

$config中的变量config.php不是全局的。

要使它成为一个全局变量,我建议你不要在它前面写出神奇的单词global

我建议你阅读superglobal variables

还有一点variable scopes

我建议做一个能够解决这个问题的课程。

应该看起来像

class Config
{
    static $config = array ('something' => 1);

    static function get($name, $default = null)
    {
        if (isset (self::$config[$name])) {
            return self::$config[$name];
        } else {
            return $default;
        }
    }
}

Config::get('something'); // returns 1;

答案 1 :(得分:2)

像这样使用Singleton Pattern

<?php
     class Configs {
        protected static $_instance; 
        private $configs =[];
        private function __construct() {        
        }

        public static function getInstance() {
            if (self::$_instance === null) {
                self::$_instance = new self;   
            }
            return self::$_instance;
        }

        private function __clone() {
        }

        private function __wakeup() {
        }     
        public function setConfigs($configs){
         $this->configs = $configs;
        }
        public function getConfigs(){
         return $this->configs;
        }
    }

Configs::getInstance()->setConfigs(['db'=>'abc','host'=>'xxx.xxx.xxx.xxxx']);

     class Something{
           public function __contruct(){}
           public function doIt(){
                  return Configs::getInstance()->getConfigs();
           }
     } 
var_dump((new Something)->doIt());

答案 2 :(得分:1)

包括如下文件:

 include("config.php"); 
     class something{ ..

并将数组打印为var_dump($config);,无需全局。

答案 3 :(得分:1)

稍微改变你的类以在构造函数上传递一个变量。

<?php
     class something{
           private $config;
           public function __contruct($config){
               $this->config = $config;
           }
           public function doIt(){
                  var_dump($this->config); // NULL  
           }
     } 
?>

然后,如果你

  1. 包括config.php
  2. 包括yourClassFile.php
  3. 并且做,

    <?php
    $my_class = new something($config);
    $my_class->doIt();
    ?>
    

    它应该有用。

    注意:永远不要使用Globals(在我们可以避免它们的地方)