繁体   English   中英

PHP OOP访问方法的好习惯?

[英]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类。 您可以通过添加User作为构造函数参数来解决此问题。
  • 单身人士往往是不好的做法。 您的代码演示了原因:它是全局可访问的,因此很难使用它跟踪依赖关系(这指向上述问题)。
  • 静态方法经常被用作全局访问点(响应您所看到的人们通常做的User :: method())。 全球接入点提供与单身人士相同的问题。 它们也有点难以测试。

我也没有看到用新对象重复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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM