我有一个接受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变量,我想找出它是否包含特定值,并让用户知道它在那里。这是我的数组: 我想做些类似的事情: 最好的方法是什么? 问题答案: 使用功能。