ด้วย Union Type ใน PHP 8 เราสามารถใช้ค่าของสองประเภทหรือมากกว่า แทนที่จะใช้ประเภทเดียว เพื่อระบุหลายประเภท ใช้ เส้นแนวตั้ง (|) ในการเชื่อมต่อ
Union type รองรับพารามิเตอร์ ประเภทคืนค่า และพรอเพอร์ตี้
รูปแบบ (Syntax)
type1|type2|...|type_n
ตัวอย่างที่ 1: Union Type
<?php
class Number
{
private int | float $num;
public function getNum(): float | int
{
return $this->num
}
public function setNum(float | int): void
{
$this->num = $num;
}
} ?>
ตัวอย่างที่ 2: โปรแกรม PHP 8 ใช้ Union Type
<?php
class Number{
private int|float $number;
public function setNumber(int|float $number): void {
$this->number = $number;
}
public function getNumber(): int|float {
return $this->number;
}
}
$number = new Number();
$number->setNumber(5);
print_r($number->getNumber());
$number->setNumber(11.54);
print_r($number->getNumber());
?>
ผลลัพธ์
5 11.54
Nullable Types ใน Union Type
ใน PHP 7.1 nullable type ใช้เครื่องหมายคำถาม ?type ใน PHP 8 เราสามารถประกาศ nullable types เป็น type|null เช่น float|int|null แต่ไม่สามารถประกาศเป็น ?float|int ได้
รูปแบบ Nullable Types
type1|type2|null
เราไม่ควรประกาศแบบ ?type1|type2 เพราะจะเป็นการประกาศที่คลุมเครือ
Compile-time error checking - ใน PHP union type ที่ซ้ำหรือซ้อนทับในการประกาศประเภทไม่ได้รับอนุญาต การตรวจสอบนี้เกิดขึ้นในขณะคอมไพล์โดยไม่ต้อง autoload คลาส/อินเตอร์เฟซ
Duplicate types ไม่ได้รับอนุญาต - เราไม่สามารถประกาศซ้ำใน PHP ได้ เช่น int|int และ int|?int ก็ไม่ได้ เพราะจะคืนค่า syntax error "Fatal error: Duplicate type... is redundant in ...on line."
void type ไม่ได้รับอนุญาต - ใน PHP 8 union type void ไม่ได้รับอนุญาตให้รวมกับประเภทอื่น
ตัวอย่าง
Function foo(): void|null{}
False Type ใน PHP 8
False type เป็นส่วนหนึ่งของ Union type ใน PHP 8 โดยส่วนใหญ่เราใช้ null เป็นค่าคืนเพื่อแสดงการขาดหายไปของค่าคืนหรือข้อผิดพลาด ตัวอย่าง: สมมติเรามีเมธอดคลาสที่หานักเรียนด้วยรหัสนักเรียน หากรหัสนักเรียนไม่มี อาจให้ null เพื่อแสดงว่ารหัสนักเรียนไม่ได้อยู่ แต่ PHP ใช้ false หาก Student ID ไม่พบ
False type ใช้สำหรับความล้มเหลวแทน null type
เราไม่สามารถใช้ false เป็น standalone type และ standalone nullable types ก็ไม่ได้รับอนุญาต นั่นคือ เราไม่สามารถใช้ false, false|null, และ ?false ได้
เราสามารถใช้ false ได้ทุกที่ที่ยอมรับประเภท เช่น พารามิเตอร์ พรอเพอร์ตี้ และค่าคืน
ไม่มี true literal type แทนที่จะใช้ bool type เท่านั้น
ตัวอย่าง
<?php
Class Student {
public function find(int $id): User|false
{
// ...
}
} ?>