PHP8の前に、多型関数パラメーターの取り扱いは比較的複雑な問題でした。 PHPは動的にタイプされた言語であるため、関数パラメーターはあらゆるタイプの値を受け入れることができます。これは、関数のパラメータータイプが一貫性がない可能性があり、その結果、関数内で行う必要がある多くのタイプのチェックと変換操作が発生し、コードを冗長で維持するのが難しいことを意味します。
ただし、ユニオンタイプの概念はPHP8で導入されたため、多型関数パラメーターを処理するより良い方法が提供されます。ユニオンタイプにより、パラメーターが複数の異なるタイプの値を受け入れることができることを指定することで、関数内の複数のタイプの判断を回避できます。
以下は、この概念を説明する特定のコード例です。
異なる形状の領域を計算するために使用される関数のカルカレアがあるとします。 php8の前に、次のコードを書くことができます。
function calcArea($shape, $params) {
switch ($shape) {
case 'rectangle':
$width = $params['width'];
$height = $params['height'];
return $width * $height;
case 'circle':
$radius = $params['radius'];
return 3.14 * $radius * $radius;
case 'triangle':
$base = $params['base'];
$height = $params['height'];
return 0.5 * $base * $height;
}
}
この例では、さまざまな形状パラメーターを渡すことで領域を計算します。ただし、関数のパラメータータイプは動的であるため、関数内のスイッチステートメントを使用して、形状パラメーターに従って異なる計算を実行する必要があります。
PHP8では、組合タイプを使用してこのコードを改善できます。 $ shapeパラメーターのタイプが「長方形」|「円」|「三角形」であることを指定し、$ paramsパラメーターのタイプを連想配列として定義できます。このようにして、関数内のスイッチステートメントを省略し、パラメーターのメソッドとプロパティを直接使用できます。
function calcArea(string $shape, array $params) {
if ($shape === 'rectangle') {
$width = $params['width'];
$height = $params['height'];
return $width * $height;
} elseif ($shape === 'circle') {
$radius = $params['radius'];
return 3.14 * $radius * $radius;
} elseif ($shape === 'triangle') {
$base = $params['base'];
$height = $params['height'];
return 0.5 * $base * $height;
}
}
この新しい実装では、追加のタイプチェックと変換操作を実行せずに、関数のパラメーターリストにタイプアノテーションを追加して、関数内に直接パラメーターとメソッドにアクセスする必要があります。これにより、コードがより簡潔で理解しやすくなります。
要約すると、PHP8のユニオンタイプは、多型関数パラメーターを処理するためのより良い方法を提供します。関数パラメーターリストで複数のタイプを指定することにより、関数内のパラメーターのプロパティとメソッドに直接アクセスできるため、段階的なタイプのチェックと変換操作を回避できます。これにより、コードがより簡潔になり、読みやすくなり、コードの複雑さを効果的に削減できます。