PHP 7은 이전 버전에 비해 다양한 새로운 기능과 개선 사항을 도입하여 개발 생산성과 코드의 견고성을 향상시켰습니다. 이러한 기능들 중에는 가변 인자 함수를 위한 확장 파라미터, 배열 및 순회 가능한 객체를 함수 호출에서 직접 펼치는 파라미터 전개, 그리고 네임스페이스 내에서 함수와 상수를 보다 명확하게 가져올 수 있는 기능이 포함됩니다.
가변 인자 함수 정의
... 연산자를 사용하면 `func_get_args()` 함수에 의존하지 않고도 가변 인자 함수를 더 간결하게 정의할 수 있습니다. 이 연산자는 나머지 모든 인자를 배열로 캡처합니다.
function process_items($required_arg, $optional_arg = null, ...$variable_args) {
echo "Required: " . $required_arg . "\n";
echo "Optional: " . ($optional_arg ?? 'Not provided') . "\n";
echo "Variable arguments count: " . count($variable_args) . "\n";
if (!empty($variable_args)) {
echo "Variable arguments: " . implode(', ', $variable_args) . "\n";
}
}
process_items(10);
process_items(10, 20);
process_items(10, 20, 30);
process_items(10, 20, 30, 40, 50);
위 코드는 다음과 같은 출력을 생성합니다:
Required: 10
Optional: Not provided
Variable arguments count: 0
Required: 10
Optional: 20
Variable arguments count: 0
Required: 10
Optional: 20
Variable arguments count: 1
Variable arguments: 30
Required: 10
Optional: 20
Variable arguments count: 2
Variable arguments: 30, 40
Required: 10
Optional: 20
Variable arguments count: 3
Variable arguments: 30, 40, 50
파라미터 전개
함수를 호출할 때 ... 연산자를 사용하여 배열이나 순회 가능한 객체를 함수의 개별 인자로 펼칠 수 있습니다. 이는 특히 함수에 동적으로 인자 목록을 전달해야 할 때 유용합니다.
function calculate_sum($num1, $num2, $num3) {
return $num1 + $num2 + $num3;
}
$values = [5, 10];
echo "Sum using parameter expansion: " . calculate_sum(1, ...$values) . "\n"; // Outputs: 16 (1 + 5 + 10)
use function 및 use const
use 키워드가 확장되어 네임스페이스 내에서 외부 함수와 상수를 명시적으로 가져올 수 있습니다. 이는 코드의 가독성을 높이고 함수 및 상수 이름 충돌을 방지하는 데 도움이 됩니다.
namespace App\Configuration {
define('APP_VERSION', '1.0');
function display_message() {
echo "Application is running.\n";
}
}
namespace {
use const App\Configuration\APP_VERSION;
use function App\Configuration\display_message;
echo "App Version: " . APP_VERSION . "\n"; // Outputs: App Version: 1.0
display_message(); // Outputs: Application is running.
}
debugInfo() 메서드
객체에 대한 var_dump() 출력을 사용자 정의하기 위해 debugInfo() 메서드를 구현할 수 있습니다. 이 메서드는 var_dump()가 객체를 표시할 때 반환할 연관 배열을 지정합니다.
class DataContainer {
private $dataValue;
public function __construct($value) {
$this->dataValue = $value;
}
public function debugInfo() {
return [
'processedValue' => $this->dataValue * 2,
'valueType' => gettype($this->dataValue)
];
}
}
var_dump(new DataContainer(100));
위 코드는 다음과 같은 출력을 생성합니다:
object(DataContainer)#1 (2) {
["processedValue"]=>
int(200)
["valueType"]=>
string(5) "integer"
}
스칼라 타입 선언
PHP 7은 함수 매개변수에 대한 스칼라 타입 선언을 도입했습니다. int, float, string, bool 타입을 지정할 수 있습니다. 기본적으로 타입은 강제(coercive) 모드이며, PHP는 자동으로 타입을 변환하려고 시도합니다. 파일 상단에 declare(strict_types=1);를 사용하여 엄격(strict) 모드를 활성화할 수 있으며, 이 경우 타입 불일치가 발생하면 TypeError가 발생합니다.
function process_numbers(int ...$numbers) {
return array_sum($numbers);
}
// Coercive mode example (default)
var_dump(process_numbers(1, '2', 3.5, true)); // Outputs: int(7) (1 + 2 + 3 + 1)
반환 타입 선언
스칼라 타입 선언과 유사하게 PHP 7은 함수의 반환 값에 대한 타입 선언을 지원합니다. 이를 통해 함수의 의도를 명확히 하고 잠재적인 버그를 조기에 발견할 수 있습니다. array, object, 특정 클래스 이름, 인터페이스, 콜러블 타입 및 스칼라 타입(int, float, string, bool)을 반환 타입으로 지정할 수 있습니다.
function sum_sub_arrays(array ...$arrays): array
{
return array_map(function(array $arr): int {
return array_sum($arr);
}, $arrays);
}
print_r(sum_sub_arrays([1, 2], [3, 4, 5], [6]));
위 코드는 다음과 같은 출력을 생성합니다:
Array
(
[0] => 3
[1] => 12
[2] => 6
)
Null 병합 연산자 (??)
Null 병합 연산자 ??는 변수가 존재하고 NULL이 아닐 경우 해당 변수의 값을 반환하고, 그렇지 않으면 두 번째 피연산자의 값을 반환하는 편리한 축약형입니다. 이는 isset()과 삼항 연산자의 조합을 대체합니다.
// Assume $_GET['user'] is not set
$user_name = $_GET['user'] ?? 'Guest'; // $user_name will be 'Guest'
// Chained null coalescing
$config_value = $_ENV['API_KEY'] ?? $_SERVER['API_KEY'] ?? 'default_key';
스페이스 쉽 연산자 (<=>)
스페이스 쉽 연산자는 두 표현식을 비교합니다. 첫 번째 피연산자가 두 번째 피연산자보다 작으면 -1, 같으면 0, 크면 1을 반환합니다. 이는 정렬 작업에 특히 유용합니다.
echo 10 <=> 5; // Output: 1
echo 5 <=> 5; // Output: 0
echo 5 <=> 10; // Output: -1
echo "apple" <=> "banana"; // Output: -1
define()으로 배열 상수 정의
PHP 7부터는 define() 함수를 사용하여 배열 타입의 상수를 정의할 수 있습니다. 이전 버전에서는 const 키워드를 사용해야 했습니다.
define('DEFAULT_COLORS', ['red', 'green', 'blue']);
echo "The second color is: " . DEFAULT_COLORS[1]; // Outputs: The second color is: green