什么时候实例化对象?

时间:2012-02-20 19:44:25

标签: php oop

在代码开头根据需要或正确实例化对象是“更好”吗?请注意,在示例中,可能不需要 obj2 的功能。

obj1 = new Object1();
obj2 = new Object2();

obj1->run;

//lots of code

if (condition) {
    obj2->doThis();
}

OR

obj1 = new Object1();
obj1->run;

//lots of code

if (condition) {
    obj2 = new Object2();
    obj2->doThis();
}

5 个答案:

答案 0 :(得分:3)

只需2条规则

  1. 如果不需要,请不要实例化任何对象。
  2. 在之前实例化。并且在不再需要时进行破坏。
  3. 不必要的对象创建会消耗更多内存并使程序运行速度变慢。对于小型项目,它不会产生任何显着的性能差异。但对于大型项目或长时间运行Cron,它会成为性能问题。

答案 1 :(得分:1)

取决于:你在if语句中的时间比在应用程序启动时花费的时间更重要吗?你不止一次需要这个物体吗?

如果两个问题的答案都是“否”,请在需要时实例化该对象。

答案 2 :(得分:1)

为了便于阅读,我倾向于实例化最接近何时使用对象。当我看到时,我发现更容易记住$obj2的内容:

if (condition) {
    $obj2 = new Object2();
    $obj2->doThis();
}

......比我看到

if (condition) {
    // $obj2 created 1000lines ago
    // and I forgot all about it
    $obj2->doThis();
}

PHP将通过释放不再使用的对象来管理内存。因此,如果您已实例化new Object1()并且在new Object2()实例化之前不再需要它,则内存中的对象将更少。 如果您没有遇到性能问题,这不应该是一个大问题。

如果你在实际需要它们之前要实例化大量的对象,请监视你的内存消耗,并三思而后行......

// Need these right away...
for ($i=0; $i<10000000; $i++) {
  $obj1s[] = new Object1();
}

// Don't actually need these until the end of the script
// but built ten million of them anyway...
for ($i=0; $i<10000000; $i++) {
  $obj2s[] = new Object2();
}

答案 3 :(得分:1)

简短回答

如果您真正需要实例化对象,那么在全局范围中的位置并不特别重要。只是不要去实例化你不会使用的对象。

可测试性答案

但是,如果您希望能够成功对代码进行单元测试,则应避免使用new关键字来实例化其他对象中的对象。你应该避免做以下事情:

class MyClass
{
  public function myMethod()
  {
    $dependency = new DependencyClass; // <--- very bad for testability
    echo $dependency->doSomething();
  }
}

class DependencyClass
{
  public function doSomething()
  {
    return 'did something';
  }
}

相反,您的类应询问在构造函数方法签名中的依赖关系,而不是在代码中的其他位置查找。更好的方法是:

class MyClass
{
  protected $dependency;

  public function __construct(DependencyClass $dep)
  {
    $this->dependency = $dep;
  }
  public function myMethod()
  {
    echo $this->dependency->doSomething();
  }
}

$myClass = new MyClass(new DependencyClass); // <-- inject the dependency

答案 4 :(得分:0)

我更喜欢在顶部(函数/文件)声明变量,但只在需要时实例化对象。

$ob1;
$obj2;

// some code...

$obj1 = new Object1();
$obj1->run;

// lots of code

if (condition) {
    $obj2 = new Object2();
    $obj2->doThis();
}

这可以让你“吃蛋糕也吃”。任何阅读代码的人都知道会发生什么,因为所有变量都是在开始时声明的,但是不要通过不必要地实例化对象来浪费内存。