在PHP中处理不同类和函数之间的全局变量

时间:2012-01-18 19:34:43

标签: php variables global

使变量可以访问所有类的最佳方法是什么。

例如,我想要一个配置文件(Call it config.php),它将具有如下变量:

$server_url = "www.myaddress.com";

我有一个主库类型文件,其中包含一堆需要访问$ server_url的类。所以这里开始主库文件:

require 'config.php';

class one {
  function a() {
          $html = "<a href='$server_url/main.php'>LINK</a>"
         return $html;
         } 

  function b() {
        $html = "<a href='$server_url/about.php'>LINK</a>"
        return $html;

         }
}


class two {

    function new() {
          $html = "<a href='$server_url/blah.php'>LINK</a>

     } 
}

使用config.php为每个函数提供$ server_url的最佳方法是什么?或至少可用于班级中的所有功能?

5 个答案:

答案 0 :(得分:3)

我个人会使用静态实体来保存所有配置值。

通常,大多数php应用程序都有一个入口点(index.php),它可以加载config.php文件,并从那时起使静态实体可用。

如果您的应用程序有多个入口点,那么您需要在每个点中包含config.php。

这样的事情:

<?php
    class Configurator{
        private static $_configuration = array();
        public static function write($key, $value) {
            self::$_configuration[$key] = $value;
        }
        public static function read($key) {
            return self::$_configuration[$key];
        }
    }
    Configurator::write('server', 'http://localhost');
    Configurator::read('server');
 ?>

CakePHP有一个类似的类:http://api.cakephp.org/view_source/configure/

答案 1 :(得分:1)

将配置放入一个类中,并在serverUrl()get('server_url')的行中使用静态方法。然后像对类的任何其他静态方法一样调用它们(我将在本例中选择后者):

$html = "<a href='" . Config::get ('server_url') . "/main.php'>LINK</a>";

配置类可能很小,使用类似的构造函数:

public function __construct (array $config)
{
  foreach ($config as $key => $value)
  {
    $this->$key = $value;
  }
}

并按以下方式添加get()方法:

public function get ($key)
{
  return $this->$key;
}

通过这种方式,您可以从一个数组中读取配置,您可以将其作为单独的实际配置文件,并为多个项目重用相同的代码。

您还可以从项目的任何位置访问变量,并且您将获得一种伪命名空间(如果项目需要在较旧版本的PHP上运行)。

请不要逐字复制代码,它是作为一个例子写的。

答案 2 :(得分:1)

认为全局变量是邪恶的。尝试使用设计模式来全局访问某些配置。

我是单身人士的忠实粉丝,可以全局访问对象,数组或其他数据类型。

<?php

class st {
    static $_this;


    function __construct(){
        self::$_this = $this;
    }

    static function &getInstance(){
        return self::$_this
    }

    static function set($key, $value){
        self::$_this[$key] = $value;
    }

    static function &get($key){
        return self::$_this[$key];
    }
}

// Usage

new st();

st::set('foo', 'bar');

// In some class
st::get('foo'); //return 'bar'

// Or when there are some classes/objects
st::getInstance()->foo->bar();
$st =& st::getInstance();
$st->foo->bar();
?>

大致写下了一个小单例,但不知道是否存在语法错误。

使用getInstance处理时,确定您通过引用=&

定义变量

答案 3 :(得分:0)

在config.php中定义一个常量,如:

define('SERVER_URL','...');

在你班上:

echo SERVER_URL;

答案 4 :(得分:0)

最适合我的是使用像 config.ini 这样的配置文件 然后使用 $my_config = parse_ini_file(file path/config.ini');

现在在我的代码中的任何地方,包括内部函数和类,我都会使用 PHP superglobal 像这样: $GLOBALS["my_config"]['my_global_var']