从静态方法中创建类实例

dan*_*iel 39 php oop class instance

正如标题所说,我想在同一个类的静态方法中创建一个类的实例.到目前为止,我已经想到了我可以做这样的事情:

class Foo{

 public $val;

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

}
Run Code Online (Sandbox Code Playgroud)

因此,我可以这样做.

$obj = Foo::bar("some variable");
Run Code Online (Sandbox Code Playgroud)

哪个好.

所以现在问题.是否有一种更容易实现的方法,我不知道,或任何实现相同结果的捷径?以这种方式创建实例有什么优点或缺点吗?

谢谢.

irc*_*ell 85

你这样做的方式很好.还有一些其他的东西可以让你的生活更轻松,你也可以做.

  1. 不要硬编码类名.如果您使用的是5.3+,请使用关键字static.这样,如果你扩展类,新函数也可以实例化那个:

    public static function bar($var) {
        $obj = new static();
        $obj->var = $var;
        return $obj;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您可以在任何扩展类中使用它,而无需覆盖任何内容.

  2. 弄清楚是否$var应该通过构造函数传入而不是在构造之后设置.如果对象依赖于它,您应该要求它.

    public function __construct($var) {
        $this->var = $var;
    }
    
    Run Code Online (Sandbox Code Playgroud)

    这样,您无法在不设置变量的情况下实例化对象.

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

    protected function __construct() {}
    private function __construct() {}
    
    Run Code Online (Sandbox Code Playgroud)

我希望有帮助......

编辑:根据您上面的评论,我觉得您正在尝试实施Singleton设计模式.有大量的信息说明为什么它不是一个好主意和它可能做的坏事.它也有用途.

但是根据你正在做的事情,还有一些其他模式对你有用.

  • 如果您尝试使用相同的步骤创建不同的对象,则可以使用" 工厂方法".
  • 如果所有对象都以相同的方式开始,然后进行自定义,则可以使用Prototype Pattern.
  • 如果创建对象的成本特别高,则可以使用对象池.

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