Php 什么';与单身汉互动最有效的方式是什么?

Php 什么';与单身汉互动最有效的方式是什么?,php,oop,Php,Oop,为了我自己的利益,我已经在自己的小框架上工作了一段时间,当我学习新东西时,不断地回顾代码。正如您所料,我有一个注册表对象,几乎所有其他对象都使用它 目前,最基本的对象(aObject)是这样设置的 absract class AFObject { var $_registry; function __construct(){ $this->_registry = AFRegistry::getInstance(); } } 因此,每个对象现在

为了我自己的利益,我已经在自己的小框架上工作了一段时间,当我学习新东西时,不断地回顾代码。正如您所料,我有一个注册表对象,几乎所有其他对象都使用它

目前,最基本的对象(aObject)是这样设置的

absract class AFObject {

    var $_registry;

    function __construct(){
        $this->_registry = AFRegistry::getInstance();
    }

}
因此,每个对象现在都将包含对注册表的本地引用。因此,如果我一次实例化了数百个对象,那就是数百个对单例的引用。但是总是像这样直接引用注册表会更高效还是更低效呢

class AFRouter extends AFObject {

    function someMethod( $bar ){
        AFRegistry::$foo = $bar;
    }

}

我认为在这种情况下,您不应该考虑效率(因为100个引用确实不是问题,而且是有点过早的优化)。但是要考虑代码中最优雅的内容。此外,考虑是否需要一个单独的(可以作为静态类实现)。我可能会选择使用您的第二种情况,因为这使您的代码更加明显(至少我认为是这样)

如果是那样的话

class AFRouter extends AFObject {

    function someMethod( $bar ){
        AFRegistry::getInstance()->$foo = $bar;
    }

}
或者,如果您封装了您的属性:

class AFRouter extends AFObject {

    function someMethod( $bar ){
        AFRegistry::getInstance()->setFoo($bar);
    }

}
在我看来,“注册表”类有点像

既然你提到你这样做是为了学习和变得更好,你有没有考虑过彻底根除你的注册表类并采取另一种方法?也许将所需的数据推送到类构造函数,而不是从类内部提取数据

我将省略选项1(抽象基类),因为这样所有的类都将依赖于其他一些类

在我看来,如果您确实希望保持注册表设置,那么使用前面提到的像Yngve Sneen这样的静态类将是最好的方法

比如: 注册表::set('var1',$var1); $var1=registry::get('var1')

考虑一下:

class AFRouter extends AFObject {
  function someMethod($bar) {
    global $af_registry;
    $af_registry->setFoo($bar);
  }
}
甚至:

class AFRouter extends AFObject {
  function someMethod($bar) {
    af_registry_set('foo', $bar);
  }
}
除了语法之外,这与您当前的解决方案基本上没有区别


是的,这意味着您的注册表本质上是一个全局变量。是的,全局变量存在问题。更好的选择是。

您应该使用public、protected或private,而不是PHP5中的var关键字。