Để kiểm tra xem một số đối tượng có thuộc một lớp nhất định hay không, toán tử [nhị phân] instanceof
có thể được sử dụng kể từ phiên bản PHP 5
Tham số đầu tiên [bên trái] là đối tượng cần kiểm tra. Nếu biến này không phải là một đối tượng, thì instanceof
luôn trả về false
. Nếu một biểu thức không đổi được sử dụng, một lỗi sẽ được đưa ra
Tham số thứ hai [bên phải] là lớp để so sánh với. Lớp có thể được cung cấp dưới dạng chính tên lớp, một biến chuỗi chứa tên lớp [không phải là hằng chuỗi. ] hoặc một đối tượng của lớp đó
class MyClass {
}
$o1 = new MyClass[];
$o2 = new MyClass[];
$name = 'MyClass';
// in the cases below, $a gets boolean value true
$a = $o1 instanceof MyClass;
$a = $o1 instanceof $name;
$a = $o1 instanceof $o2;
// counter examples:
$b = 'b';
$a = $o1 instanceof 'MyClass'; // parse error: constant not allowed
$a = false instanceof MyClass; // fatal error: constant not allowed
$a = $b instanceof MyClass; // false [$b is not an object]
instanceof
cũng có thể được sử dụng để kiểm tra xem một đối tượng có thuộc một lớp nào đó mở rộng một lớp khác hay thực hiện một số giao diện
interface MyInterface {
}
class MySuperClass implements MyInterface {
}
class MySubClass extends MySuperClass {
}
$o = new MySubClass[];
// in the cases below, $a gets boolean value true
$a = $o instanceof MySubClass;
$a = $o instanceof MySuperClass;
$a = $o instanceof MyInterface;
Để kiểm tra xem một đối tượng không thuộc một lớp nào đó, có thể sử dụng toán tử not [!
]
class MyClass {
}
class OtherClass {
}
$o = new MyClass[];
$a = !$o instanceof OtherClass; // true
Lưu ý rằng dấu ngoặc đơn xung quanh $o instanceof MyClass
là không cần thiết vì instanceof
có độ ưu tiên cao hơn !
, mặc dù nó có thể làm cho mã dễ đọc hơn với dấu ngoặc đơn
Hãy cẩn thận
Nếu một lớp không tồn tại, các chức năng tự động tải đã đăng ký được gọi để cố gắng xác định lớp [đây là một chủ đề nằm ngoài phạm vi của phần này của Tài liệu. ]. Trong các phiên bản PHP trước 5. 1. 0, toán tử instanceof
cũng sẽ kích hoạt các cuộc gọi này, do đó thực sự xác định lớp [và nếu lớp không thể được xác định, một lỗi nghiêm trọng sẽ xảy ra]. Để tránh điều này, hãy sử dụng một chuỗi
// only PHP versions before 5.1.0!
class MyClass {
}
$o = new MyClass[];
$a = $o instanceof OtherClass; // OtherClass is not defined!
// if OtherClass can be defined in a registered autoloader, it is actually
// loaded and $a gets boolean value false [$o is not a OtherClass]
// if OtherClass can not be defined in a registered autoloader, a fatal
// error occurs.
$name = 'YetAnotherClass';
$a = $o instanceof $name; // YetAnotherClass is not defined!
// $a simply gets boolean value false, YetAnotherClass remains undefined.
Kể từ phiên bản PHP 5. 1. 0, trình tải tự động đã đăng ký không được gọi nữa trong những tình huống này
Các phiên bản cũ hơn của PHP [trước 5. 0]
Trong các phiên bản PHP cũ hơn [trước 5. 0], hàm
interface MyInterface {
}
class MySuperClass implements MyInterface {
}
class MySubClass extends MySuperClass {
}
$o = new MySubClass[];
// in the cases below, $a gets boolean value true
$a = $o instanceof MySubClass;
$a = $o instanceof MySuperClass;
$a = $o instanceof MyInterface;
3 có thể được sử dụng để xác định xem một đối tượng có thuộc loại nào đó hay không. Hàm này không được dùng trong phiên bản PHP 5 và không được dùng trong phiên bản PHP 5. 3. 0Trong khi hàm