- 관련 내용은 앞으로 확인 되는 대로 추가될 예정
클래스 상속 시, 메서드 내부 static 변수의 공유
- 기존 7.3 에서는 클래스 상속 시, 메서드 내부의 static 변수들을 자식객체, 부모객체 서로 공유하지 않았으나, 8.1 부터는 공유하도록 변경되었다.
<?php
echo phpversion().PHP_EOL;
class A
{
public static $val = 1;
public static $arr = array() ;
public function staticVarTestA($addVal = 0)
{
static $local = 1;
$local += $addVal;
echo "[staticVarTestA] local: {$local}".PHP_EOL;
}
public static function staticVarTestB($addVal = 0)
{
static $local = 1;
$local += $addVal;
echo "[staticVarTestB] local: {$local}".PHP_EOL;
}
}
class B extends A
{
}
class C extends A
{
}
$A = new A();
$B = new B();
$C = new C();
$A->staticVarTestA(1);
$B->staticVarTestA(10);
$C->staticVarTestA(100);
A::staticVarTestB(1);
B::staticVarTestB(10);
C::staticVarTestB(100);
stdClass 객체의 변수명에 { } 로 가변 변수명을 사용하는 것
<?php
echo phpversion().PHP_EOL;
$std = new stdClass();
for ($i = 0; $i < 3; $i++)
{
$std->reward_{$i} = $i;
}
echo json_encode($std);
<?php
echo phpversion().PHP_EOL;
$std = new stdClass();
for ($i = 0; $i < 3; $i++)
{
$col_name = "reward_{$i}";
$std->$col_name = $i;
}
echo json_encode($std).PHP_EOL;
for ($i = 0; $i < 3; $i++)
{
$std->{"reward_{$i}"} = $i;
}
echo json_encode($std).PHP_EOL;
php 내부 클래스/인터페이스의 상속/구현시 리턴타입 명시
interface JsonSerializable
{
public function jsonSerialize(): mixed;
}
class A implements jsonSerializable
{
public $single;
public $option;
public function __construct()
{
$this->option = new option();
$this->single = new single();
}
public function jsonSerialize()
{
$reflect = new ReflectionClass(__CLASS__);
$a_properties = $reflect->getProperties();
foreach ($a_properties as $property) {
$name = $property->name;
if ($this->$name == null) {
unset($this->$name);
}
}
return get_object_vars($this);
}
}
class A implements jsonSerializable
{
public $single;
public $option;
public function __construct()
{
$this->option = new option();
$this->single = new single();
}
public function jsonSerialize() : mixed
{
$reflect = new ReflectionClass(__CLASS__);
$a_properties = $reflect->getProperties();
foreach ($a_properties as $property) {
$name = $property->name;
if ($this->$name == null) {
unset($this->$name);
}
}
return get_object_vars($this);
}
}
class A implements jsonSerializable
{
public $single;
public $option;
public function __construct()
{
$this->option = new option();
$this->single = new single();
}
public function jsonSerialize()
{
$reflect = new ReflectionClass(__CLASS__);
$a_properties = $reflect->getProperties();
foreach ($a_properties as $property) {
$name = $property->name;
if ($this->$name == null) {
unset($this->$name);
}
}
return get_object_vars($this);
}
}
strlen() 의 parameter 로 null 이 들어올 때의 처리
- 7.3 버전에서는 0을 반환하고, 8.1 에서는 deprecated 경고가 뜬다.
<?php
echo phpversion().PHP_EOL;
if (strlen(null) === 0)
{
echo "true";
}
else
{
echo "false";
}
APC -> APCu 로 교체
- APC (opcode cache + user cache) 에서 php 5.5 이상에서 opcache 기능을 공식 지원하면서 , APC의 user cache 부분만 떼어내서 만들어진 것이 APCu
- 8.x 버전에서는 더이상 구버전의 APC를 지원해주는 모듈을 찾지 못해서, APCu 로 변경한다.
- 만약 모듈이 있다면, 기존 걸 써도되는데, docker 관련해서 8.1을 지원하는 모듈을 찾지 못했음.
- 각 함수에서 apc 부분을 apcu 로 교체하면 된다 (ex. apc_fetch → apcu_fetch)
- apc로 저장한 걸 apcu 로 읽어올 수 있고, apcu로 저장한 걸 apc로 읽어올 수 있다. (즉 7.x 버전에는 일부 덜 고쳐진것이 있더라도 동작한다. 단, 8.1을 위해서는 모두 apcu로 고쳐져야한다.)
<?php
echo phpversion().PHP_EOL;
$key = phpversion()."hello!";
apc_store($key, $key);
echo phpversion()."결과:";
echo apc_fetch($key).PHP_EOL;
apc_delete($key);
echo phpversion()."결과:";
echo apc_fetch($key).PHP_EOL;
<?php
echo phpversion().PHP_EOL;
$key = phpversion()."hello!?";
apc_store($key, $key);
echo "apc_store->apcu_fetch 결과:";
echo apcu_fetch($key).PHP_EOL;
apcu_store($key, $key."2");
echo "apcu_store->apc_fetch 결과:";
echo apc_fetch($key).PHP_EOL;
<?php
echo phpversion().PHP_EOL;
$key = phpversion()."hello";
apcu_store($key, $key);
echo "apcu_store->apcu_fetch 결과:";
echo apcu_fetch($key).PHP_EOL;
apcu_delete($key);
echo "apcu_delete->apcu_fetch 결과:";
echo apcu_fetch($key).PHP_EOL;
타입 자동 변환 (bool → Array) deprecated
- bool 타입으로 초기화 된 것을 Array로 셋팅하여 사용할 때 자동으로 Array로 변환해 주던 것 deprecated
<?php
echo phpversion().PHP_EOL;
$a = FALSE;
if (isset($a[1]) == false)
{
$a[1] = 1;
}