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
你这样做的方式很好.还有一些其他的东西可以让你的生活更轻松,你也可以做.
不要硬编码类名.如果您使用的是5.3+,请使用关键字static.这样,如果你扩展类,新函数也可以实例化那个:
public static function bar($var) {
$obj = new static();
$obj->var = $var;
return $obj;
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以在任何扩展类中使用它,而无需覆盖任何内容.
弄清楚是否$var应该通过构造函数传入而不是在构造之后设置.如果对象依赖于它,您应该要求它.
public function __construct($var) {
$this->var = $var;
}
Run Code Online (Sandbox Code Playgroud)
这样,您无法在不设置变量的情况下实例化对象.
通过静态方法强制实现类的实例化.如果你在那里做任何你需要做的事情,那么使构造函数保护或私有.这样,有人无法绕过静态方法.
protected function __construct() {}
private function __construct() {}
Run Code Online (Sandbox Code Playgroud)我希望有帮助......
编辑:根据您上面的评论,我觉得您正在尝试实施Singleton设计模式.有大量的信息说明为什么它不是一个好主意和它可能做的坏事.它也有用途.
但是根据你正在做的事情,还有一些其他模式对你有用.
但有一点需要考虑的是,PHP对象的重量非常轻.不要试图避免仅为此开销创建新对象.避免多次执行数据库查询或文件系统访问等繁重操作.但是不要担心打电话,new Foo()除非foo构造函数特别沉重......
| 归档时间: |
|
| 查看次数: |
30359 次 |
| 最近记录: |