Tiếp tục với bài trước, bài này mình sẽ tiếp tục cập nhật thêm các tính năng có trong PHP 8.
10. Stricter type checks for arithmetic/bitwise operators.
Phiên bản lần này PHP cũng ràng buộc kĩ hơn những phân liên quan đến các toán tử số học hay bitwise trong PHP.
VD: như chia 2 array, decrement array.
[] % [42] // PHP Warning: Uncaught TypeError: Unsupported operand types: array % array in php shell code
$a = [['one'], ['two']];
foreach ($a as $var) {
$var--;
}
// Output: PHP Fatal error: Uncaught TypeError: Cannot decrement array
11. Validation for abstract trait methods.
Trước đây, chúng ta đã có thể khai báo phương thức trừu tượng (abstract method) trong Trait
nhưng việc validate sử dụng nó lại rất thất thường.
VD: Đối với PHP 7
trait MyTrait
{
abstract private function neededByTheTrait(): string;
public function doSomething()
{
return strlen($this->neededByTheTrait());
}
}
class TraitUser
{
use MyTrait;
// This is allowed:
private function neededByTheTrait(): string
{
}
}
// Ouput: PHP Fatal error: Abstract function MyTrait::neededByTheTrait() cannot be declared private
Việc khai báo abstract trong khi không thể sử dụng được? WTF?
GIờ đây đối với PHP 8 đã hoàn thiện hơn và hoạt động tốt.
12. Correct signatures of magic methods.
Giờ đây các magic method bắt buộc phải return đúng kiểu được quy định chứ không thoải mái như trước nữa. Hay các tham số truyền vào cũng cần phải validate
VD: Đối với PHP 7.
class SampleClass
{
public function __isset($name): string
{
// TODO: Implement __isset() method.
}
public function __clone(): int
{
// TODO: Implement __clone() method.
}
}
Nhưng đối với PHP 8 sẽ trả về error
. Như sau:
PHP Fatal error: SampleClass::__isset(): Return type must be bool when declared
PHP Fatal error: SampleClass::__clone(): Return type must be void when declared
VD: Truyền tham số thứ nhất là array
và tham số thứ 2 là chuỗi trong PHP7.4
class SampleClass
{
public function __call(array $name, string $arguments)
{
// TODO: Implement __call() method.
}
}
Nhưng với PHP 8 sẽ trả về error
. Như sau:
PHP Fatal error: SampleClass::__call(): Parameter #1 ($name) must be of type string when declared
PHP Fatal error: SampleClass::__call(): Parameter #2 ($arguments) must be of type array when declared
Và đây là list return type của các magic method:
__clone
- không trả về giá trị (returnvoid
)__isset
- trả về kiểubool
__sleep
- trả vềarray
__set
- không trả về giá trị (returnvoid
)__toString
- trả vềstring
__wakeup
- không trả về giá trị (returnvoid
)
Và đây param type truyền vào các magic method:
__call
/__callStatic
- tham số thứ nhất phải là string, tham số thứ 2 phải là mảng__get
/__set
/__isset
/__unset
- tham số phải là string__set_state
- tham số phải là array.
13. Reclassifying engine warnings.
Phân biệt lại các cảnh báo, error trong PHP. Ở phiên bản này PHP sẽ gom nhóm, phân loại lại các lỗi vào các Exception
khác nhau.
Trong các trường hợp các bạn cần catch lại được hêt các Error các bạn cần phải catch qua Throwable vì những Error như Type Error
lại không được base từ Exception
(cái này từ PHP 7 => hơi củ chuối).
Các bạn có thể xem thêm các quy tắc gom nhóm của PHP (ở đây)
14. Fatal error for incompatible method signatures.
Chuyển tất cả các warning đối với các vấn đề implement method không tương thức với base thành Fatal error
.
VD: Khi ta khai báo lại method trong class con mà thay đổi type truyền vào method trong các phiên bản PHP 7 nó chỉ coi đó là warning thôi. Giờ đây PHP 8 sẽ coi những kiểu lỗi như này là "Fatal error
"
class C1 {
public function method(array $a) {}
}
class C2 extends C1 {
public function method(int $a) {}
}
// PHP 8 ouput: PHP Fatal error: Declaration of C2::method(int $a) must be compatible with C1::method(array $a)
15. The @ operator no longer silences fatal errors.
Từ phiên bản PHP 8, khi bạn sử dụng kí tự @
trước các câu lệnh nó sẽ không ngăn được các "fatal errors" nữa.
VD: Đối với PHP 7
@ $a % [""];
Nhưng đối với PHP 8 nó sẽ throw ra "fatal error
"
16. Inheritance with private methods.
Giờ đây PHP 8 sẽ bắn ra warning khi bạn khai báo một phương thức private
là final
. Vì một phương thức đã khai báo là private
thì chúng ta cũng không thể nào thấy nó trong class cha, và vì vậy việc orverwrite nó là vô nghĩa.
VD: PHP 8 sẽ bắn ra waring nếu bạn cố gắng muốn khai báo một private
method là final
.
class A
{
final private function finalPrivate()
{
echo "a" . __METHOD__ . PHP_EOL;
}
}
// Output: PHP Warning: Private methods cannot be final as they are never overridden by other classes
17. Mixed type.
Trong trường hợp nếu như bạn không biết được type của arguments hay return type của function, method. Đối với các phiên bản cũ của PHP các bạn chỉ cẩn bỏ trống không khai báo data type là được. Nhưng như thế sẽ hơi dở vì code đang set type hết mà mọc ra mấy đoạn code không có type. Chính vì thế trong phiên bản PHP 8 họ đã bổ sung thêm mixed type. Kiểu này trước đây chỉ hỗ trợ trong PHPDoc block.
VD:
function test(mixed $a) : mixed
{
return $a;
}
18. Một số tính năng khác.
Thêm WeakMap
class (cái này mình sẽ có bài nói sau)
Stringable interface
Thêm str_contains()
, str_starts_with()
, str_ends_with()
function.
Cho phép sử dụng Allow ::class
on objects
...
Đăng ký nhận tin.
Chúng tôi chỉ gửi tối đa 2 lần trên 1 tháng. Tuyên bố không spam mail!
0 Comments