如何将资源强制为函数参数(类型声明)

时间:2016-05-13 14:27:16

标签: php type-hinting

我想确保函数只接受template<class PayloadType> class SimpleEvent : public Event<PayloadType> { protected: PayloadType payload; public: SimpleEvent(PayloadType payload) : Event<PayloadType>(payload) { } ~~~~~~~~~~~~~ }; 作为参数。

对于任何其他类型,我只会写类似于

的内容
resource

每当我向字符串传递除字符串以外的任何内容时,PHP都会抛出一个TypeError。好的。

PHP documentation on the subject并未将function my_function(string $my_string) { } 列为类型声明候选。

我知道我可以使用像

这样的东西
resource

然而,这感觉不对。在我看来,类型声明/提示存在是有充分理由的,我不明白为什么function my_function($resource) { if (!is_resource($resource)) { throw new InvalidArgumentException('resource expected, ' . gettype($resource) . ' given'); } // do stuff that expects the resource } 无法使用(我能理解为什么不允许resource。)

(旁注,a solution对于旧行为,即使不允许标量类型也不允许检查资源。所以,我不是唯一一个寻找它的人...)< / p>

有一个论点,我可以想到为什么trait不能被声明:作为一个resource仍然可以意味着许多事情,因为它可能是任何一种资源。但是,这个论点也适用于resource可以声明的类型!

上面的代码是最好的方法吗?还有其他方法吗?还是我走错了路?我错过了一些观点吗?

正在寻找PHPDoc解决方案。虽然这有助于开发,但它不会在运行时捕获错误的参数。

1 个答案:

答案 0 :(得分:2)

在PHP中,资源与C中的文件描述符不相似。没有单一的接口。例如,xml_parser_create和fopen都返回资源但具有不同的接口。因此强制函数参数为资源类型。真的不是很多。

您最好的选择是正确创建类所需的接口,并创建一个默认的包装类,为相关的资源功能实现此接口。这将使您的班级用户获得最大的自由。