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