在代码开头根据需要或正确实例化对象是“更好”吗?请注意,在示例中,可能不需要 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();
}
答案 0 :(得分:3)
只需2条规则
不必要的对象创建会消耗更多内存并使程序运行速度变慢。对于小型项目,它不会产生任何显着的性能差异。但对于大型项目或长时间运行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();
}
这可以让你“吃蛋糕也吃”。任何阅读代码的人都知道会发生什么,因为所有变量都是在开始时声明的,但是不要通过不必要地实例化对象来浪费内存。