与空数组和通知相关的良好做法
Good practice related to empty arrays and notices
我开始开发一些比我之前做的更复杂的东西,我想做它 "by the book" 我读到应该避免注意,即使它们不影响可用性。
所以我有一个函数可以检查 URL 并将其拆分为多个部分。然后我用它来生成页面,但我在首页上收到一条通知,因为没有足够的部分。
这里有一些代码可以看出我在说什么:
$slug = getRightURL();
在getRightURL()
我有:
$curURL = $_SERVER['REQUEST_URI'];
$URL = explode('/', $curURL);
return $URL[2];
因此,当 url 只是 http://example.com/
时,函数会发出通知;
我正在考虑添加这个:
if(count($URL) > 1) return $URL[1];
但是有更好的方法吗?
如果没有看到您的 getRightURL()
应该 return 的确切规范,这很难回答,但如果它是已解析的 url 的最后一部分,您可以使用:
$URL = explode('/', $curURL);
return last($URL);
您应该查看 parse_url
来解析您的 url。这将为您提供比分解解析更可靠的结果:
$URL = parse_url($curURL);
return $URL['path'];
仅仅计数并不总能解决问题,因为 PHP 数组实际上并不是数组(从 0 到长度 1 的索引),而是可以包含各种未排序的字符串和数字的映射作为索引。
要查明特定索引是否存在,请使用 isset()。
if(isset($URL[2])) {
return $URL[2];
}
else {
return '';
}
您也可以像这样使用三元运算符缩短它:
return (isset($URL[2]) ? $URL[2] : '');
在请求的 uri 上使用 explode()
之前,尝试稍微清理一下字符串并添加一些错误检查。我想到了 trim()
和 isset()
。
// If the uri were /controller/view or /controller/view/...
$uri = trim($_SERVER['REQUEST_URI'], "/");
// trim with a character mask of "/" will clean up your uri leaving
// controller/view
$uri = explode("/", $uri);
// As a side note, calling explode on an empty string will return an array
// containing an index (key) of 1 and a value of "" (empty string). This is
// important as you don't have to implicitly check if $uri is an array with
// is_array() or fear a warning appearing when passing explode an empty string
// (i.e. explode("/", "") results in array([1] => ))
// Check that you did need explode and that the requested index exists...
if(isset($uri[2])) {
...
}
参考文献:
<a href="http://php.net/manual/en/function.trim.php" rel="nofollow">trim()</a>
<a href="http://php.net/manual/en/function.isset.php" rel="nofollow">isset()</a>
我开始开发一些比我之前做的更复杂的东西,我想做它 "by the book" 我读到应该避免注意,即使它们不影响可用性。
所以我有一个函数可以检查 URL 并将其拆分为多个部分。然后我用它来生成页面,但我在首页上收到一条通知,因为没有足够的部分。
这里有一些代码可以看出我在说什么:
$slug = getRightURL();
在getRightURL()
我有:
$curURL = $_SERVER['REQUEST_URI'];
$URL = explode('/', $curURL);
return $URL[2];
因此,当 url 只是 http://example.com/
时,函数会发出通知;
我正在考虑添加这个:
if(count($URL) > 1) return $URL[1];
但是有更好的方法吗?
如果没有看到您的 getRightURL()
应该 return 的确切规范,这很难回答,但如果它是已解析的 url 的最后一部分,您可以使用:
$URL = explode('/', $curURL);
return last($URL);
您应该查看 parse_url
来解析您的 url。这将为您提供比分解解析更可靠的结果:
$URL = parse_url($curURL);
return $URL['path'];
仅仅计数并不总能解决问题,因为 PHP 数组实际上并不是数组(从 0 到长度 1 的索引),而是可以包含各种未排序的字符串和数字的映射作为索引。
要查明特定索引是否存在,请使用 isset()。
if(isset($URL[2])) {
return $URL[2];
}
else {
return '';
}
您也可以像这样使用三元运算符缩短它:
return (isset($URL[2]) ? $URL[2] : '');
在请求的 uri 上使用 explode()
之前,尝试稍微清理一下字符串并添加一些错误检查。我想到了 trim()
和 isset()
。
// If the uri were /controller/view or /controller/view/...
$uri = trim($_SERVER['REQUEST_URI'], "/");
// trim with a character mask of "/" will clean up your uri leaving
// controller/view
$uri = explode("/", $uri);
// As a side note, calling explode on an empty string will return an array
// containing an index (key) of 1 and a value of "" (empty string). This is
// important as you don't have to implicitly check if $uri is an array with
// is_array() or fear a warning appearing when passing explode an empty string
// (i.e. explode("/", "") results in array([1] => ))
// Check that you did need explode and that the requested index exists...
if(isset($uri[2])) {
...
}
参考文献:
<a href="http://php.net/manual/en/function.trim.php" rel="nofollow">trim()</a>
<a href="http://php.net/manual/en/function.isset.php" rel="nofollow">isset()</a>