0

请问这种方法

    foreach($data as &$d)
       $obj[]=ClassName::createObject($data);

或者

    foreach($data as &$d){
       $obj[] = new ClassName;
       $obj[end($obj)]->loadData($data);
     }

-

     class ClassName{
        public static function createObject($data){
              $obj = new ClassName;
              //do stuff with $data
              return $obj;
        }

        public function loadData($data){
              //do stuff with $data;

        }

     }

::createObject 方法使代码阅读起来不那么痛苦,而第二种方法不必返回巨大的对象。我不确定如何用 PHP 之类的语言处理变量,所以性能上有很大差异吗?哪种方法最好使用?

4

2 回答 2

2

首先看起来还可以。在这种情况下,您不需要$d通过引用传递。也许你想要ClassName::createObject($d)。我仍然会将其重构为:

foreach($data as $d) {
   $obj[]=new ClassName($d);
}

这只是丑陋,不是出于性能原因:

foreach($data as &$d){
   $obj[] = new ClassName;
   $obj[end($obj)]->loadData($data);
 }

相反,您可以这样做:

foreach($data as &$d){
   $object = new ClassName;
   $object->loadData($d);
   $obj[] = $object;
 }

如果数据对对象至关重要 - 从构造中设置它。如果数据是可选的,那么该loadData方法是有意义的。但是,如果您想将构造逻辑移动到静态方法 - 这是没有意义的。没有性能优势。

于 2012-12-19T14:44:50.693 回答
0

静态方法没有任何优势。作为静态的工厂方法在功能上与 new 关键字(也是静态的)相同。你建议它保存一行代码,但如果你总是需要在构造对象后调用 ->loadData() ,那么你应该将数据传递给构造函数:

$obj = new ClassName($data);

在这种情况下使用静态方法调用并不能解决任何问题,只会增加复杂性/膨胀。

于 2012-12-19T14:44:40.770 回答