Programing

PHP에서 특정 유형의 객체를 확인하는 방법

crosscheck 2020. 11. 28. 08:40
반응형

PHP에서 특정 유형의 객체를 확인하는 방법


PDO 개체를 인수로 받아들이는 메서드를 사용하여 사용자가 새 연결을 열고 리소스를 저장하는 대신 기존 연결을 사용할 수 있도록합니다.

public static function databaseConnect($pdo = null) {

is_object()인수가 개체 인지 확인하는 것을 알고 있지만 개체 $pdo가 아닌 PDO 개체 인지 확인하고 싶습니다 .

사용자가 다른 종류의 객체, mysqli 등을 (실수로?) 쉽게 입력 할 수 있기 때문에 전체 스크립트가 분리됩니다.

요약 : 특정 유형의 개체에 대한 변수를 어떻게 확인할 수 있습니까?


다음을 사용할 수 있습니다 instanceof.

if ($pdo instanceof PDO) {
    // it's PDO
}

하지만을 부정 할 수는 없으므로 !instanceof대신 다음을 수행합니다.

if (!($pdo instanceof PDO)) {
    // it's not PDO
}

또한 질문을 살펴보면 개체 유형 힌트를 사용하여 요구 사항을 적용하고 검사 논리를 단순화 할 수 있습니다.

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

입력 된 인수는 필수 또는 선택 사항 일 수 있습니다.

// 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) { }

형식화되지 않은 인수는 명시 적 조건을 통해 유연성을 허용합니다.

// 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')) {
        // ...
    }
}

후자의 경우 ( 사용method_exists ), 내 의견에 약간 혼합되어 있습니다. Ruby에서 온 사람들 respond_to?은 더 좋든 나쁘 든 에게 익숙 할 것 입니다. 개인적으로 인터페이스를 작성하고 이에 대해 일반적인 유형 힌트를 수행합니다.

interface QueryableInterface
{ 
    function query();
}

class MyPDO extends PDO implements QueryableInterface { }

function connect(QueryableInterface $queryable) { }

그러나 이것이 항상 가능한 것은 아닙니다 . 이 예제에서 PDO객체는 기본 유형이를 구현하지 않으므로 유효한 매개 변수가 아닙니다 QueryableInterface.

값은 PHP에서 변수가 아닌 유형을 갖는다는 점도 언급 할 가치가 있습니다 . 이것은 검사에 null실패 하기 때문에 중요 instanceof합니다.

$object = new Object();
$object = null;
if ($object instanceof Object) {
    // never run because $object is simply null
}

값은 유형이 null부족한이면 유형을 잃습니다 .


사용하다

 bool is_a ( object $object , string $class_name )

This will work for child classes too.

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

EDIT: Or you could use type hinting:

public static function databaseConnect(PDO $pdo = null) {...

As pointed out in other answers, instanceof, get_class, and is_a are probably what you're looking for.

However, rather than coding in a lot of guards that test for type, some developers find it more productive (and easier to read) to just let the runtime handle the enforcement, particularly when you're talking about calls other programmers will be making (when a programmer makes a mistake, app-breaking loud complaints are arguably a good thing).

If you really need to not have the script fall apart when a programmer uses your method incorrectly, wrap the relevant section of code (in this case, probably the inside of databaseConnect) in a try block, maybe use set_error_handler to throw exceptions on script errors, and then set up one or more catch blocks which indicated what to do when an exception condition happens.


I think you can use instanceof something like:

if ($pdo instanceof YOUR_PDO_OBJECT_INSTANCE) {
   // it is...
}

참고URL : https://stackoverflow.com/questions/8091143/how-to-check-for-a-specific-type-of-object-in-php

반응형