foreach
ループPHPはiterable変数を1回取り、それを内部イテレータで処理します。あなたの同僚の反対は、すべての反復の前に毎回継続条件が実行される単純なfor
ループに適用されます。
あなたは簡単にテストケースを作成することができます
<?php
class testClass
{
private
$_iteratable = ['a', 'b', 'c'];
public function get()
{
echo "get called<br>\n";
return $this->_iteratable;
}
}
echo "foreach<br>\n";
$obj = new testClass();
foreach($obj->get() as $key => $value)
{
echo "$key: $value<br>\n";
}
/* OUTPUT:
foreach
get called
0: a
1: b
2: c
*/
echo "<p>for<br>\n";
$obj = new testClass();
for($i = 0; $i < count($obj->get()); $i++)
{
echo "$i: {$obj->get()[$i]}<br>\n";
}
/* OUTPUT:
for
get called
get called
0: a
get called
get called
1: b
get called
get called
2: c
get called
?>
あなたの代わりに各反復をコピーして、おそらく大きなデータ値のデータへの参照のみ以来foreach($iteratable as &$reference)
を使用する場合がありますパフォーマンスを向上させるために。そうすることで、foreachループに渡された元のデータを処理します。つまり、そのデータを操作することさえできます。 foreachを値で使用すると、コピーを処理し、元のデータにアタッチすることなく作業値を変更できます。
オブジェクトRoles()は何をしますか? – johnny
テーブルを表す雄弁なモデルで、データベースとのやりとりが可能です。基本的には、$ roles-> get()は、ロールが表すテーブルから、私の場合はテーブルUser__rolesをすべて返します。 – Yanaro