What's new in PHP 9
https://yarnaudov.com/new-in-php-9.html
PHP RFC: Deprecate dynamic properties
https://wiki.php.net/rfc/deprecate_dynamic_properties
1. 변수 초기화 강제.
http://docs.php.net/manual/kr/types.comparisons.php
2. 클래스 동적 프로퍼티 자동 추가 허용안함(기본값).
[기존 php8 이하] - 경고는 하지만 실행완료
<?php
class planet
{
function __construct($id, $a, $m) {
$this->a = $a;
$this->id = $id;
$this->m = $m;
$this->n = .9856076686 / ($a * sqrt($a));
}
}
$pl = [
new planet("Mercury", .38709831, 3.3011e23),
new planet("Venus", .723332982, 4.8675e24)
];
echo $pl[0]->n;
echo "\n";
echo $pl[1]->n;
?>
[Result]
Deprecated: Creation of dynamic property planet::$a is deprecated in /tmp/h8LaXZUAtT.php on line 6
Deprecated: Creation of dynamic property planet::$id is deprecated in /tmp/h8LaXZUAtT.php on line 7
Deprecated: Creation of dynamic property planet::$m is deprecated in /tmp/h8LaXZUAtT.php on line 8
Deprecated: Creation of dynamic property planet::$n is deprecated in /tmp/h8LaXZUAtT.php on line 9
Deprecated: Creation of dynamic property planet::$a is deprecated in /tmp/h8LaXZUAtT.php on line 6
Deprecated: Creation of dynamic property planet::$id is deprecated in /tmp/h8LaXZUAtT.php on line 7
Deprecated: Creation of dynamic property planet::$m is deprecated in /tmp/h8LaXZUAtT.php on line 8
Deprecated: Creation of dynamic property planet::$n is deprecated in /tmp/h8LaXZUAtT.php on line 9
4.0923442626812
1.6021260118792
[php9 이상] - Throws Error exception. 다른 언어처럼 planet 클래스의 property 멤버 변수 명시적 선언 강제.
<?php
class planet
{
public $id;
public $a;
public $m;
public $n;
function __construct($id, $a, $m) {
$this->a = $a;
$this->id = $id;
$this->m = $m;
$this->n = .9856076686 / ($a * sqrt($a));
}
}
$pl = [
new planet("Mercury", .38709831, 3.3011e23),
new planet("Venus", .723332982, 4.8675e24)
];
echo $pl[0]->n;
echo "\n";
echo $pl[1]->n;
?>
[Result]
4.0923442626812
1.6021260118792
또는 #[\AllowDynamicProperties] attributes 사용하여 이전처럼 자동생성 허용[권장하지않음]
<?php
#[\AllowDynamicProperties]
class planet
{
function __construct($id, $a, $m) {
$this->a = $a;
$this->id = $id;
$this->m = $m;
$this->n = .9856076686 / ($a * sqrt($a));
}
}
$pl = [
new planet("Mercury", .38709831, 3.3011e23),
new planet("Venus", .723332982, 4.8675e24)
];
echo $pl[0]->n;
echo "\n";
echo $pl[1]->n;
?>
[Result]
4.0923442626812
1.6021260118792
PHP8.2 이하에서 planet 클래스 설계에 없는 멤버변수를 호출시 멤버변수 자동 생성되었으나 php9에서 불가능(기본값).
※ 기존 문제 예) 멤버변수 a를 콜하려고 하였지만, aa 오타로 호출했을 때 코더의 의도 판단 할 수 없어 멤버변수 생성 통과.
<?php
class planet
{
public $a;
public $id;
function __construct($a, $id) {
$this->a = $a;
$this->id = $id;
}
}
$pl = new planet("Mercury",100);
echo $pl->a;
echo "\n";
echo $pl->id;
echo "\n";
$pl->none="oops"; //??
echo $pl->none; //??
?>
[Result]
Mercury
100
Deprecated: Creation of dynamic property planet::$none is deprecated in /tmp/U6HuK5Qs9j.php on line 21
oops