与空数组和通知相关的良好做法

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>