2011-01-11 63 views
26

正如标题所说,我想从同一个类的静态方法内创建一个类的实例。我已经想通了,我可以做这样的事情:从静态方法内创建类实例

class Foo{ 

public $val; 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 

} 

因此,让我这样做。

$obj = Foo::bar("some variable"); 

这很好。

所以现在的问题。有没有一种更容易的方式来做到这一点,我不知道或达到相同结果的捷径?以这种方式创建实例有什么优点或缺点吗?

谢谢。

+2

你是什么理由做这种方式?为什么不使用普通的`$ obj = new Foo(“some variable”);`? – 2011-01-11 14:19:07

回答

68

他们这样做的方式很好。还有一些其他的事情可以让你的生活更轻松,你也可以做得更好。

  1. 请勿硬编码类名。如果您使用的是5.3+,请使用关键字static。这样,如果你扩展的类,新功能可以实例化一个还有:

    public static function bar($var) { 
        $obj = new static(); 
        $obj->var = $var; 
        return $obj; 
    } 
    

    然后你就可以在任何继承类使用它,而无需重写任何东西。

  2. 弄清楚,如果$var应通过构造函数传递,而不是施工后设置。如果对象依赖于它,则应该要求它。

    public function __construct($var) { 
        $this->var = $var; 
    } 
    

    这样,你不能没有设置变量实例化对象。

  3. 通过静态方法强制类的实例化。如果你在那里做任何你需要做的事情,那么让构造函数保护或者保密。这样,有人不能绕过静态方法。

    protected function __construct() {} 
    private function __construct() {} 
    

我希望帮助...

编辑:基于您上面的评论,这听起来像你试图执行Singleton Design Pattern。这里有很多关于为什么它不是一个好主意和它可能做的坏事的信息。它也有用。

但还有一些其他模式可能对您有用,具体取决于您在做什么。

  • 可以使用Factory Method如果你想创建一个使用相同的步骤,不同的对象。
  • 如果所有对象的起始位置相同,然后自定义,则可以使用Prototype Pattern
  • 如果创建对象特别昂贵,则可以使用Object Pool

但有一点需要考虑的是,在PHP中,对象的重量非常轻。不要试图避免为此开销创建一个新对象。避免多次重复数据库查询或文件系统访问等操作。但不要担心拨打new Foo(),除非foo的构造函数特别沉重......

0

如果你只是创建一个对象,这不是非常有用。你可以调用一个构造函数。但是,如果你正在做的事情更复杂(比如你开始用某种单例模式,但没有包括在这个例子中所有的细节),则:

这听起来是正确的。如果你想阻止在默认的方式是这样创建的对象:

$obj = new Foo("Some Variable"); 

您可以添加一个私有构造函数:

class Foo{ 

public $val; 

private __construct(){} 

public static function bar($val){ 
    $inst = new Foo; 
    $inst->val = $val; 
    return $inst; 
} 
} 

现在你强制人们使用您的静态类。在函数中设置val的需求可能会消失,所以您甚至可以将value参数添加到您的私有构造函数中,但在您的项目中执行其他操作(假设您想要执行的操作,比如检查某种单例模式) 'bar'功能

3

这看起来像一个简单的工厂方法模式。

你有一个很好的优势:假设你将来想要开始使用不同的实现(但它也是一样的)。使用工厂,只需更改创建者方法,即可更改在复杂系统的许多位置创建的所有对象。请注意,如果您使用外部类(如下面的第一个链接所示),这会更容易。

保持现有状态,您还可以继承此类并覆盖创建更复杂对象的方法。我不认为这是你想在这里实现的。

无论如何,这是很好的启用测试驱动开发,抽象和许多其他好东西。

链接:

  1. Php patterns
  2. Factory method pattern on wikipedia
相关问题