[英]PHP OOP Good practice for accessing methods?
我有一些代码经常看起来像这样:
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();
}
实际上现在我考虑一下这可能是代码较少,因为我不需要构造函数...
我在PHP中的个人偏好是使用只有静态方法的类来实现单例,所以你有
User::foo();
User::bar();
我不会创建一个新类只是为了包装像这样的单例。 但是如果你的新类增加了一些额外的逻辑,那么你的例子就有意义。 请记住,如果您担心自己过于冗长,可以随时使用临时变量进行连续的函数调用。
$user = User::getInstance();
$user->foo();
$user->bar();
但就个人而言,我不再使用单身人士了。 相反,我使用依赖注入。 我喜欢sfServiceContainer,但还有其他人。 看看这一系列文章: http : //fabien.potencier.org/article/11/what-is-dependency-injection
UPDATE
根据其他评论,我就是这样做的:
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对象。 例如:
class UserMock { ... } // A fake object that looks like a User
$userTest = new UserWrapper(new UserMock());
您的方法确实存在一些问题。
我也没有看到用新对象重复User对象的重点,除非您使用例如适配器模式。 也许如果你能澄清这一点,我将能够提出一个比通用更好的替代方案:
class Foo {
public function __construct(User $user) {
$this->user = $user;
}
public function doXsimplified() {
$this->user->doXbutMoreComplex($arg1,$arg2, $arg20);
}
}
我通常会这样,如果你已经将类包含在某种类型的引导程序或配置文件中。 我通常会在每个页面加载时调用引导程序中的$ user变量,然后将其作为全局变量引用到其他php文件上,这就是我在引导程序文件中所拥有的。
$user = new User();
那么这就是我在调用php文件中所拥有的
global $user;
$user->foo();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.