Helpex - Trao đổi & giúp đỡ Đăng nhập
68

Tôi có một phương thức chấp nhận một đối tượng PDO làm đối số, để cho phép người dùng sử dụng kết nối hiện có thay vì phương thức này để mở một kết nối mới và tiết kiệm tài nguyên:

public static function databaseConnect($pdo = null) {

Tôi biết is_object()để kiểm tra xem đối số có phải là một đối tượng hay không, nhưng tôi muốn kiểm tra xem có phải $pdolà một đối tượng PDO hay không chỉ là một đối tượng.

Bởi vì người dùng có thể dễ dàng nhập (do nhầm lẫn?) Một loại đối tượng khác, một mysqli hoặc tương tự, và toàn bộ tập lệnh sẽ bị phá vỡ.

Tóm lại: Làm cách nào tôi có thể kiểm tra một biến cho một loại đối tượng cụ thể?

68 hữu ích 0 bình luận 50k xem chia sẻ
93

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, PDOcá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ì nullsẽ không instanceofkiể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.

93 hữu ích 5 bình luận chia sẻ
11

sử dụng

 bool is_a ( object $object , string $class_name )

Điều này cũng sẽ hiệu quả đối với các lớp học trẻ em.

xem http://php.net/is-a

CHỈNH SỬA: Hoặc bạn có thể sử dụng gợi ý kiểu:

public static function databaseConnect(PDO $pdo = null) {...
11 hữu ích 3 bình luận chia sẻ
3

Như đã chỉ ra trong câu trả lời khác, instanceof, get_class, và is_acó lẽ là những gì bạn đang tìm kiếm.

Tuy nhiên, thay vì viết mã trong nhiều bảo vệ để kiểm tra loại, một số nhà phát triển thấy rằng việc để thời gian chạy xử lý việc thực thi sẽ hiệu quả hơn (và dễ đọc hơn), đặc biệt là khi bạn đang nói về các cuộc gọi mà các lập trình viên khác sẽ thực hiện ( khi một lập trình viên mắc lỗi, những lời phàn nàn lớn về việc phá vỡ ứng dụng được cho là một điều tốt).

Nếu bạn thực sự cần để tập lệnh không bị hỏng khi lập trình viên sử dụng phương pháp của bạn không chính xác, hãy bọc phần mã có liên quan (trong trường hợp này, có thể là bên trong cơ sở dữ liệuConnect) trong một khối thử , có thể sử dụng set_error_handler để ném ngoại lệ về lỗi tập lệnh , và sau đó thiết lập một hoặc nhiều khối bắt cho biết phải làm gì khi điều kiện ngoại lệ xảy ra.

3 hữu ích 0 bình luận chia sẻ
2

Tôi nghĩ bạn có thể sử dụng instanceofmột cái gì đó như:

if ($pdo instanceof YOUR_PDO_OBJECT_INSTANCE) {
   // it is...
}
2 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ php oop object-type , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading