当前位置: 首页 > 面试题库 >

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

刁俊人
2023-03-14
问题内容

我有一个接受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,缺少类型。



 类似资料:
  • 问题内容: 我的MySQL数据库包含使用不同存储引擎(特别是myisam和innodb)的几个表。如何找出哪些表正在使用哪个引擎? 问题答案: 这将给您(除其他事项外)一列,这是您想要的。

  • 问题内容: 我用这段代码检查图像的类型, 但是有些用户抱怨上传任何类型的图像时都会出错,而另一些用户则没有错误! 我想知道这是否可以解决问题: 任何意见? 问题答案: 永远不要使用。其中包含的信息完全未经验证,它是用户定义的值。自己测试类型。对于图像,通常是一个不错的选择: 另外,如果您的服务器支持这些功能,则它们的功能很棒。

  • 我试图找到一种方法来传递一个对象来发挥作用,并在运行库中检查它的类型。这是一个伪代码: 但是总是返回,我无法找到获取或的真正类型的方法。也不起作用,返回了相同的内容。

  • 问题内容: 我是Java泛型的新手,来自.NET世界,我习惯于编写这样的方法: 该方法接受通用类型的对象,并检查该对象是否实现通用接口的 特定 版本,在这种情况下为。 现在,在Java中,我可以执行以下操作: 但 Java并 没有 让我做 据我所知,由于类型擦除,通常在Java中,此类将由类对象处理,我们将执行以下操作: 但是由于我要检查的类型是通用接口,所以您不能这样做: 那么,如何在Java中

  • 问题内容: 我有一个由组成的数组。我想遍历它,并找到所有属于数组实例的元素。 如何在Swift中检查对象是否为给定类型? 问题答案: 如果要检查特定类型,可以执行以下操作: 您可以使用“ as!” 如果类型不正确,则会引发运行时错误 您也可以一次检查一个元素:

  • 问题内容: 我有一个Array类型的PHP变量,我想找出它是否包含特定值,并让用户知道它在那里。这是我的数组: 我想做些类似的事情: 最好的方法是什么? 问题答案: 使用功能。