2012-01-18 82 views
0

使变量可访问所有类的最佳方式是什么?在PHP中处理不同类和函数之间的全局变量

例如,我想有一个配置文件(称为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可用于每个函数?或者至少可以在课堂上使用所有功能?

+0

开始了解依赖注入 – 2012-01-18 19:41:17

回答

2

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

通常,大多数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/

+0

好吧,一个静态的实体。原谅我的无知,但你怎么做一个静态的实体? – renosis 2012-01-18 19:41:51

+0

感谢您的帮助! – renosis 2012-01-18 19:52:32

+0

谢谢马丁!奇迹般有效 – Awena 2015-06-14 13:17:45

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上运行)。

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

1

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

我是一个单身人士的粉丝,以获得全局访问对象,数组或其他数据类型。

<?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处理它一定是按引用=&

0

定义变量定义一个常量,在这样的config.php:

定义( 'SERVER_URL', '...');

在你的课堂上:

echo SERVER_URL;