如何创建一个全局可访问的对象

时间:2009-08-30 09:55:30

标签: php oop global-variables

您好我有一些课程集合,其中一些课程应该可以全球访问。

我在Zend_Registry中发现了类似的东西,但是读取它的代码我无法理解对静态函数的调用如何能够返回类的初始化实例......

我需要做类似的事情:

<?php
//index.php
$obj = new myUsefulObject();
$obj->loadCfg("myFile.xml");
$req = new HTTPRequest();
$req->filter("blablabla");
myappp::registerClass("object",$obj);
myappp::registerClass("request",$req);
$c = new Controller();
$c->execute();
?>

这里我已经过滤了Request对象,我希望控制器能够访问已经过滤的请求。

<?php
class Controller
{
    function __construct()
    {
        $this->request = Application::getResource("request");//This must be the filtered var =(
    }
}

?>

我不知道如何实现Application :: getResource(),我唯一知道的是它必须是静态方法,因为它不能与特定实例相关。

3 个答案:

答案 0 :(得分:3)

除静态方法外,PHP还具有静态属性:类的本地属性。这可用于实现单例,或实际上是注册表:

class Registry { 
    private static $_registry;

    public static function registerResource($key, $object) 
    { 
        self::$_registry[$key] = $object; 
    }

    public static function getResource($key) { 
        if(!isset(self::$_registry[$key]))
            throw InvalidArgumentException("Key $key is not available in the registry");

        return self::$_registry[$key];
    }
}

答案 1 :(得分:1)

1:您可以使用global关键字访问全局变量:

$myVar = new SomethingProvider();
class MyClass {
    public function __construct() {
        global $myVar;
        $myVar->doSomething();
    }
}

2:你可以使用$GLOBALS超全局:

来做同样的事情
$myVar = new SomethingProvider();
class MyClass {
    public function __construct() {
        $GLOBALS['myVar']->doSomething();
    }
}

3:您可以定义singleton class(维基百科也有nice example

4:您可以将全局变量作为公共静态成员(或具有公共getter / setter的私有静态成员)添加到类中:

class Constants {
    const NUM_RETIES = 3;
}
if ($tries > Constants::NUM_RETRIES) {
    # User failed password check too often.
}

class Globals {
    public static $currentUser;
}
Globals::$currentUser = new User($userId);

我不推荐前两种方法,无意中覆盖这些全局变量的值太容易了。

答案 2 :(得分:0)

在我看来,你可能需要某种形式的Singleton设计模式;

检查this

希望它有所帮助!