我有一些通常看起来像这样的代码:
private $user;
public function __construct()
{
$this->user = User::getInstance(); //singleton
}
public function methodOne()
{
return $this->user->foo();
}
public function methodTwo()
{
return $this->user->foo2();
}
public function methodThree()
{
return $this->user->foo3();
}
我想如果我将user属性设置为实例,我可以在我的方法中重用一个较短的名称(在这种情况下,它不会那么短)。我也认为这样做可能会节省一些资源(开始怀疑它),但当我看到其他人的代码时,我很少看到人们这样做。他们通常只会打电话:
User::getInstance()->foo();
User::getInstance()->foo2();
User::getInstance()->foo3();
对此有什么最佳做法吗?也许如果它不是单身人士课你可以这样做吗?或者也许你永远不应该这样做?希望得到一些澄清,谢谢。
编辑: 如果有任何误解,我只是想知道我是否应该创建一个属性来存储实例的第一个例子vs:
public function methodOne()
{
return User::getInstance()->foo();
}
public function methodTwo()
{
return User::getInstance()->foo2();
}
public function methodThree()
{
return User::getInstance()->foo3();
}
实际上现在我想起来这可能是代码较少,因为我不需要构造函数......
答案 0 :(得分:2)
我在PHP中的个人偏好是使用只有静态方法的类来实现单例,所以你有
User::foo();
User::bar();
答案 1 :(得分:2)
我不会创建一个新类只是来包装像这样的单例。但是如果你的新类增加了一些额外的逻辑,那么你的例子就有意义。请记住,如果您担心自己过于冗长,可以随时使用临时变量进行连续的函数调用。
$user = User::getInstance();
$user->foo();
$user->bar();
但就个人而言,我不再使用单身人士了。相反,我使用依赖注入。我喜欢sfServiceContainer,但还有其他人。看看这一系列文章:http://fabien.potencier.org/article/11/what-is-dependency-injection
<强>更新强>
根据其他评论,我就是这样做的:
class UserWrapper
{
private $user = null;
public function __construct($user)
{
$this->user = $user;
}
public function foo()
{
return $this->user->foo();
}
...
}
然后像这样使用它:
$user = new UserWrapper(User::getInstance());
为什么呢?因此,如果我想测试UserWrapper类,我可以传入一个假的User对象。 E.g:
class UserMock { ... } // A fake object that looks like a User
$userTest = new UserWrapper(new UserMock());
答案 2 :(得分:2)
您的方法确实存在一些问题。
我也没有看到用新对象重复User对象的重点,除非您使用例如适配器模式。也许如果你能澄清这一点,我将能够提出一个比通用更好的选择:
class Foo {
public function __construct(User $user) {
$this->user = $user;
}
public function doXsimplified() {
$this->user->doXbutMoreComplex($arg1,$arg2, $arg20);
}
}
答案 3 :(得分:0)
如果您已将类包含在某种类型的引导程序或配置文件中,我通常会这样。我通常会在每个页面加载时调用引导程序中的$ user变量,然后在其他php文件中将其作为全局变量引用,这就是我在引导程序文件中所拥有的。
$user = new User();
然后这就是我在调用php文件中所拥有的
global $user;
$user->foo();