Bạn có thể sử dụng instanceof
:
if ($pdo instanceof PDO) {
// it's PDO
}
Tuy nhiên, hãy lưu ý rằng, bạn không thể phủ định like !instanceof
, vì vậy thay vào đó bạn nên làm:
if (!($pdo instanceof PDO)) {
// it's not PDO
}
Ngoài ra, xem qua câu hỏi của mình, bạn có thể sử dụng gợi ý loại đối tượng, giúp thực thi các yêu cầu, cũng như đơn giản hóa logic kiểm tra của bạn:
function connect(PDO $pdo = null)
{
if (null !== $pdo) {
// it's PDO since it can only be
// NULL or a PDO object (or a sub-type of PDO)
}
}
connect(new SomeClass()); // fatal error, if SomeClass doesn't extend PDO
Các đối số đã nhập có thể là bắt buộc hoặc tùy chọn:
// required, only PDO (and sub-types) are valid
function connect(PDO $pdo) { }
// optional, only PDO (and sub-types) and
// NULL (can be omitted) are valid
function connect(PDO $pdo = null) { }
Các đối số không định kiểu cho phép sự linh hoạt thông qua các điều kiện rõ ràng:
// accepts any argument, checks for PDO in body
function connect($pdo)
{
if ($pdo instanceof PDO) {
// ...
}
}
// accepts any argument, checks for non-PDO in body
function connect($pdo)
{
if (!($pdo instanceof PDO)) {
// ...
}
}
// accepts any argument, checks for method existance
function connect($pdo)
{
if (method_exists($pdo, 'query')) {
// ...
}
}
Đối với cái sau ( sử dụngmethod_exists
), tôi có một chút hỗn hợp trong quan điểm của tôi. Những người đến từ Ruby sẽ thấy nó quen thuộc respond_to?
, tốt hơn hoặc xấu hơn. Cá nhân tôi sẽ viết một giao diện và thực hiện một gợi ý loại bình thường chống lại điều đó:
interface QueryableInterface
{
function query();
}
class MyPDO extends PDO implements QueryableInterface { }
function connect(QueryableInterface $queryable) { }
Tuy nhiên, điều đó không phải lúc nào cũng khả thi; trong ví dụ này, PDO
các đối tượng không phải là tham số hợp lệ vì kiểu cơ sở không triển khai QueryableInterface
.
Cũng cần nhắc lại rằng các giá trị có kiểu , không phải biến, trong PHP. Điều này rất quan trọng vì null
sẽ không instanceof
kiểm tra được.
$object = new Object();
$object = null;
if ($object instanceof Object) {
// never run because $object is simply null
}
Giá trị mất đi kiểu của nó khi nó trở thành null
, thiếu kiểu.