在函数调用中键入任何对象的提示

时间:2014-01-28 08:21:25

标签: php

如何在PHP中明确地键入 - 我将接收到的对象作为函数参数?

只有当它是一个有效的例子时,这才能满足我的要求:

function example(object $argument)
{
    $argument->property = 'something';
}

(后者给我“参数必须是对象的实例,给定的实例”)

is_object()不构成类型检查,因为我希望程序失败并且如果没有提供对象则会很难。

On可以说我可以做assert(is_object($argument))但是可以关闭断言,从而避免这种类型的检查。抛出任何条件表达式抛出异常都不会使它变得更好。

2 个答案:

答案 0 :(得分:2)

TL; DR - 根据the manual,这样的提示不是(还可能?)。

您可以使用stdClass提示来测试通用对象:

function example(\stdClass $argument)
{
    echo $argument->foo;
}

或者让所有类派生自您自己的基类或实现一些接口:

function example(MyBaseClass $argument)
{
}

或者,只需使用is_object()手动检查变量类型:

function example($argument)
{
    if (!is_object($argument)) {
        trigger_error("Invalid argument", E_USER_ERROR);
        // or: throw new InvalidArgumentException();
    }
    // it's an object
}

也就是说,检查任何对象并不能为整个应用程序提供太多信息;一个明确的测试类将是要走的路。

答案 1 :(得分:1)

检查函数参数称为类型提示:

class ConcreteClass {...}
function(ConcreteClass obj) {...}

这通常用于检查:

if ($obj instanceof ConcreteClass) {
    //do stuff
}

if (is_object($obj)) {
    //do stuff
}

我更喜欢类型提示和instanceof。