PHPのプログラムを改善しながらローカル変数酷使度を理解する
2025/03/27

PHPのローカル変数酷使度を計測するツールを作ってます。この記事で記載されているローカル変数酷使度は、このツールで計測しました。
プログラムの可読性や保守性を向上させるためには、ローカル変数の適切な管理が重要です。特に、「ローカル変数を酷使しすぎるとコードが複雑になり、可読性や修正のしやすさが低下する」 という問題が発生します。
本記事では、PHPでCSVの1行を生成する関数を例に取り、ローカル変数酷使度 を段階的に改善しながら、その有用性を示していきます。
ローカル変数酷使度とは?
ローカル変数酷使度 とは、関数内の変数のスコープの広さや更新頻度を数値化した指標です。変数の使用範囲が広く、更新回数が多いほど値が大きくなり、コードの可読性が低下しやすくなります。
今回の例では、以下の関数を順番に改善しながら、ローカル変数酷使度を減らしていきます。
改善のステップ
ステップ 1: 初期状態(ローカル変数酷使度: 131)
<?php
/** ローカル変数酷使度: 131 */
function createCsvLine1($values) {
$result = "";
$count = count($values);
for ($i = 0; $i < $count; $i++) {
$value = $values[$i];
// 文字列なら " で囲む
if (is_string($value)) {
$formattedValue = '"' . $value . '"';
} else {
$formattedValue = $value;
}
if ($i == 0) {
$result .= $formattedValue;
} else {
$result .= "," . $formattedValue;
}
}
return $result;
}
問題点:
$result
を直接操作しており、条件分岐if ($i == 0)
によってコードが複雑化$formattedValue
という変数を毎回生成し、ローカル変数の使用が増加for
ループを使っているが、foreach の方が適切
ステップ 2: foreach
に置き換え(ローカル変数酷使度: 106)
<?php
/** ローカル変数酷使度: 106 */
function createCsvLine2($values) {
$result = "";
foreach ($values as $value) {
// 文字列なら " で囲む
if (is_string($value)) {
$formattedValue = '"' . $value . '"';
} else {
$formattedValue = $value;
}
if (empty($result)) {
$result .= $formattedValue;
} else {
$result .= "," . $formattedValue;
}
}
return $result;
}
改善点:
for
ループをforeach
に置き換え、ループの変数$i
を削減empty($result)
により、最初の要素かどうかを判定(ただし$result
の操作は続く)
$result
を直接操作するため、文字列連結処理のコストが高い
ステップ 3: 配列を活用(ローカル変数酷使度: 45)
<?php
/** ローカル変数酷使度: 45 */
function createCsvLine3($values) {
$columns = [];
foreach ($values as $value) {
// 文字列なら " で囲む
if (is_string($value)) {
$formattedValue = '"' . $value . '"';
} else {
$formattedValue = $value;
}
$columns[] = $formattedValue;
}
return implode(',', $columns);
}
改善点:
$result
の文字列連結をimplode()
に置き換え、可読性と効率を向上- 変数
$columns
を使うことで ローカル変数の酷使を軽減
ステップ 4: 変数のスコープをさらに縮小(ローカル変数酷使度: 15)
<?php
/** ローカル変数酷使度: 15 */
function createCsvLine4($values) {
$columns = [];
foreach ($values as $value) {
$columns[] = is_string($value) ? '"' . $value . '"' : $value;;
}
return implode(',', $columns);
}
改善点:
formattedValue
という不要な変数を削除し、変数のスコープを縮小- コードが簡潔に
ステップ 5: array_map()
を活用し、最適化(ローカル変数酷使度: 9)
<?php
/** ローカル変数酷使度: 6 + 3 = 9 */
function createCsvLine5($values) {
return implode(',', array_map(function ($value) {
return is_string($value) ? '"' . $value . '"' : $value;
}, $values));
}
最適化のポイント:
foreach
すら不要になり、関数のスコープを最小限に抑えた- コード量を削減しながら、ローカル変数の酷使度を大幅に改善
まとめ
ステップ | 方法 | ローカル変数酷使度 |
---|---|---|
1 | for を使用、文字列連結あり |
131 |
2 | foreach を使用、文字列連結あり |
106 |
3 | 配列を活用し implode() を使用 |
45 |
4 | formattedValue を削除し簡潔化 |
15 |
5 | array_map() を活用し最適化 |
9 |