PHP OOP访问方法的好习惯?

时间:2011-03-12 23:29:15

标签: php oop 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();
}

实际上现在我想起来这可能是代码较少,因为我不需要构造函数......

4 个答案:

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

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