Php PSR-7接口-具有百分比编码的无效组件

Php PSR-7接口-具有百分比编码的无效组件,php,encoding,uri,psr-7,Php,Encoding,Uri,Psr 7,我一直在研究的实现,关于实现何时应该为某些组件抛出InvalidArgumentException的规范有点令人费解 例如,同一docblock指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码。” 规范的其余部分都证明了实现负责管理编码 由于实现确保了正确的编码,因此实现的用户似乎可以将任意数量的无效字符传递到类似withPath的函数中,然后对该函数进行正确编码,而不是触发异常 我能想到的唯一一个可以证明InvalidArgumentException的情况是,如果with

我一直在研究的实现,关于实现何时应该为某些组件抛出InvalidArgumentException的规范有点令人费解

例如,同一docblock指出,“用户可以提供编码和解码的路径字符”,因为“实现确保正确的编码。”

规范的其余部分都证明了实现负责管理编码

由于实现确保了正确的编码,因此实现的用户似乎可以将任意数量的无效字符传递到类似withPath的函数中,然后对该函数进行正确编码,而不是触发异常

我能想到的唯一一个可以证明InvalidArgumentException的情况是,如果withPath被传递了一个非字符串(不管它值多少,似乎是)

真正严格阅读似乎可以避免这种“严格类型”解释,但我不禁想知道PHP-FIG是否还有其他想法,特别是考虑到URI语法的复杂性


是否有任何情况下,如果传递字符串,withPath等UriInterface方法应该引发异常?

我知道,您的问题有点老了:-)

你的假设完全正确

关于该部分:

用户可以提供编码和解码的路径字符。
实现确保了getPath()中所述的正确编码

这与“无效路径”(在
@throws
标记中描述)无关。它只是声明——正如您正确地断言的那样,用户可以提供编码字符和解码字符,这些字符将被正确地编码——在意义上相应地编码百分比。例如,一些未编码的字符将采用百分比编码,而其他字符则不采用百分比编码。原则上,编码方案为:

Percent-encode all URI path characters, except:

 - the unreserved characters,
 - the reserved characters of the subset "gen-delims",
 - the reserved characters of the subset "sub-delims",
 - the already percent-encoded characters.
另一方面,在以下参数无效的情况下会引发异常-
InvalidArgumentException

  • withScheme
    :不是字符串,也不是允许的字符串列表的一部分 方案
  • withHost
    :不是字符串
  • withPort
    :不是数字(或整数?),不在范围[165535]内
  • withPath
    :不是字符串
  • withQuery
    :不是字符串
  • withFragment
    :不是字符串
最后,一个特殊处理接收作为(可选NULL)构造函数参数传递的URI字符串(
$URI
):

  • 未设置
  • 不是字符串
  • 是空的
。。。以及URI部分数组,作为对URI字符串参数调用
parse_url
的结果(这里抛出
UnexpectedValueException
):

注意,我已经列出了UriInterface实现中的所有异常抛出情况

Percent-encode all URI path characters, except:

 - the unreserved characters,
 - the reserved characters of the subset "gen-delims",
 - the reserved characters of the subset "sub-delims",
 - the already percent-encoded characters.
$uriParts = parse_url($uri);

if ($uriParts === FALSE) {
    throw new \UnexpectedValueException('URI could not be parsed!');
}