我想确保函数只接受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解决方案。虽然这有助于开发,但它不会在运行时捕获错误的参数。
答案 0 :(得分:2)
在PHP中,资源与C中的文件描述符不相似。没有单一的接口。例如,xml_parser_create和fopen都返回资源但具有不同的接口。因此强制函数参数为资源类型。真的不是很多。
您最好的选择是正确创建类所需的接口,并创建一个默认的包装类,为相关的资源功能实现此接口。这将使您的班级用户获得最大的自由。