PHP容器类参数类型校验时,为何异常提示提及参数名?
PHP容器类resolve方法异常信息疑问解答
我正在学习PHP课程,对Container类中检查类型参数正确性的条件存在疑问,以下是该类的resolve方法代码片段:
public function resolve(string $className) { $reflectionClass = new ReflectionClass($className); if (!$reflectionClass->isInstantiable()) { throw new ContainerException("Class {$className} is not instantiable"); } $constructor = $reflectionClass->getConstructor(); if (!$constructor) { return new $className; } $parameters = $constructor->getParameters(); if (count($parameters) === 0) { return new $className; } $dependencies = []; foreach ($parameters as $param) { $name = $param->getName(); $type = $param->getType(); if (!$type) { throw new ContainerException("Failed to resolve class {$className} because param name {$name} is missing"); } if (!$type instanceof ReflectionNamedType || $type->isBultin()) { throw new ContainerException("Failed to resolve class {$className} because invalid param name"); } } dd($parameters); }
疑问:代码中明明是在检查参数类型的有效性,但抛出的ContainerException异常中却引用了参数的名称,这是为什么?
这是代码里的错误,异常信息的描述和实际检查逻辑完全不匹配:
- 第一个判断
!$type时,实际是参数没有声明类型,却错误提示“param name {$name} is missing”,正确描述应该指向类型缺失,比如改成“param {$name} has no type declaration”。 - 第二个判断的逻辑是检查参数类型是否为非内置的命名类型(也就是自定义类或接口类型),但异常信息写的是“invalid param name”,这完全文不对题,应该改成“param {$name} has invalid type (must be a non-built-in named type)”这类准确描述。
本质就是开发者编写异常信息时搞混了逻辑,把类型相关的错误错误关联到了参数名称上,属于典型的代码笔误/描述错误。
内容的提问来源于stack exchange,提问作者Natalia Kaczyńska
相关产品推荐
相关产品推荐

