2

嗨,我有一些类的集合,其中一些应该是全球可访问的。

我在 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(),我唯一知道的是它必须是静态方法,因为它不能与特定实例相关。

4

3 回答 3

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];
    }
}
于 2009-08-30T10:15:50.780 回答
1

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

$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:你可以定义一个单例类(维基百科也有一个很好的例子)。

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);

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

于 2009-08-30T10:31:02.450 回答
0

在我看来,您可能需要某种形式的单例设计模式;

看看这个

希望能帮助到你!

于 2009-08-30T10:17:51.573 回答