2016-07-14 7 views
1

"Create object and pass it to function"または"Create object inside function" の間で私は不思議です - 関数内でオブジェクトを作成すると、だから私は1関数に渡す前にオブジェクトを作成するか、関数内でオブジェクトインスタンスを作成する間にPHPの性能が発生する

1) $a = new A(); 
test($a); 

2) test1(){$a=new A(); ..} 

よりも2より良いと思いますが、関数がループ内で呼び出された場合、私は疑問に思うので、2ケースは、オブジェクトを毎回作成されます。多分、それは1よりも多くの資源を奪うでしょうか? ここに私のテストコードが、

$start_mem = memory_get_usage(); 

var_dump($start_mem); 
$start = microtime(true); 
for($i=0; $i < 10000; $i++) { 
    test(); 
} 
$end = microtime(true); 
$end_mem = memory_get_usage(); 
echo "Timne: ". ($end - $start). "\n"; 
var_dump($end_mem); 
echo "Mem: ". ($end_mem - $start_mem). "\n"; 
######### test 2 
// $start_mem = memory_get_usage(); 
// var_dump($start_mem); 
// $start = microtime(true); 
// $obj = new PingSitemap(); 
// for($i=0; $i <10000; $i++) { 
//  test1($obj); 
// } 

// $end = microtime(true); 
// $end_mem = memory_get_usage(); 
// echo "Timne: ". ($end - $start). "\n"; 
// var_dump($end_mem); 
// echo "Mem: ". ($end_mem - $start_mem). "\n"; 

function test() { 
    $obj = new PingSitemap(); 
    for($i=0; $i < 1000; $i++) { 
     $obj->counta(); 
    } 
} 

function test1($obj) { 
    for($i=0; $i < 1000; $i++) { 
     $obj->counta(); 
    } 
} 
+0

関数の外にオブジェクトが必要かどうかに基づいてこの問題を決めるのが普通ですが、これは確かに面白い質問です。 後で自宅で自分でテストケースをいくつか作ります。 – PockeTiger

+0

2番目のオプションを使用した場合、関数は依存性が強く、オブジェクトAが消滅したり変更されたりすると、関数がクラッシュする可能性があります。あなたが望むなら、[dependency injection](http://code.tutsplus.com/tutorials/dependency-injection-in-php--net-28146)を読んでください。 –

+0

パフォーマンスは真剣にあなたの懸念事項の中で最も少なくなります。 *コードの意味*とハードコードの依存関係に関する考慮事項ははるかに重要です。 – deceze

答えて

1

は私がローカル変数であるため、スクリプトは、関数の最後を取得するときに、変数が破壊されるため、2番目は、優れていると思うことを答えることは多分それは完璧ではありません。

たぶんこの記事はあなたを助けることができる:Does PHP free local variables immediately after the function ends?

一方、あなたは私が同じはあなただと思うループを作りたい場合。

関連する問題