提问人:Madara's Ghost 提问时间:11/11/2011 最后编辑:BenMadara's Ghost 更新时间:3/4/2015 访问量:53176
如何在 PHP 中检查特定类型的对象
How to Check for a Specific Type of Object in PHP
问:
我有一个接受PDO对象作为参数的方法,允许用户使用现有连接而不是打开新连接的方法,并节省资源:
public static function databaseConnect($pdo = null) {
我知道要检查参数是否是对象,但我想检查是否是 PDO 对象,而不仅仅是一个对象。is_object()
$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
评论
Array
PDO
string
ErrorException
我认为您可以使用 instanceof
这样的东西:
if ($pdo instanceof YOUR_PDO_OBJECT_INSTANCE) {
// it is...
}
用
bool is_a ( object $object , string $class_name )
这也适用于子类。
编辑: 或者您可以使用类型提示:
public static function databaseConnect(PDO $pdo = null) {...
评论
instanceof
正如其他答案中指出的,、、和可能是你要找的。instanceof
get_class
is_a
然而,一些开发人员发现,与其编写大量测试类型的保护程序,不如让运行时处理强制执行更有效率(也更易于阅读),尤其是当你谈论其他程序员将要进行的调用时(当程序员犯错误时,破坏应用程序的大声抱怨可以说是一件好事)。
如果你真的不需要在程序员错误地使用你的方法时让脚本分崩离析,那么将代码的相关部分(在本例中,可能是 databaseConnect 的内部)包装在一个 try 块中,也许使用 set_error_handler 在脚本错误时抛出异常,然后设置一个或多个 catch 块,指示在发生异常情况时该怎么做。
评论