如何在 PHP 中检查特定类型的对象

2022-08-30 08:54:39

我有一个方法,它接受PDO对象作为参数,以允许用户使用现有连接而不是方法打开一个新连接,并节省资源:

public static function databaseConnect($pdo = null) {

我知道检查参数是否是一个对象,但我想检查是否是一个PDO对象,而不仅仅是一个对象。is_object()$pdo

因为用户可以很容易地(错误地?)输入不同类型的对象,mysqli等,整个脚本就会破裂。

简而言之:如何检查特定类型对象的变量?


答案 1

您可以使用以下实例

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

但是,这并不总是可行的。在此示例中,对象不是有效的参数,因为基类型未实现 。PDOQueryableInterface

还值得一提的是,在PHP中,值具有类型,而不是变量。这很重要,因为检查将失败。nullinstanceof

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

当值变成 时,它失去了它的类型,缺少类型。null


答案 2

 bool is_a ( object $object , string $class_name )

这也适用于子类。

http://php.net/is-a

编辑:或者你可以使用类型提示:

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

推荐