与空数组和通知相关的良好实践

时间:2015-01-23 21:31:14

标签: php notice

我开始开发一些比以前更复杂的东西,并且我想“按照书”来做,并且我已经读过,应该避免通知,即使它们不影响可用性。

所以我有一个检查URL并将其分成多个部分的函数。然后我用它来生成页面,但由于没有足够的部分,我在首页上收到通知。

这里有一些代码可以看到我在说什么:

$slug = getRightURL();

getRightURL()我有:

$curURL = $_SERVER['REQUEST_URI'];
$URL = explode('/', $curURL);
return $URL[2];

因此,当网址只是http://example.com/时,该函数会发出通知;

我正在考虑添加这个:

if(count($URL) > 1) return $URL[1];

但有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

由于PHP数组实际上并不是数组(从0到长度为1的索引),所以只计数并不总是有效,但映射的地方可以包含所有未排序的字符串和数字作为索引。

要查明特定索引是否存在,请使用isset()。

if(isset($URL[2])) {
    return $URL[2];
}
else {
    return '';
}

您还可以使用三元运算符缩短它,如下所示:

return (isset($URL[2]) ? $URL[2] : '');

答案 1 :(得分:1)

如果没有看到getRightURL()应返回的确切规格,这很难回答,但如果它是解析后的网址的最后一部分,您可以使用:

$URL = explode('/', $curURL);
return last($URL);

你应该调查parse_url来解析你的网址。这将比解析爆炸提供更可靠的结果:

$URL = parse_url($curURL);
return $URL['path'];

答案 2 :(得分:1)

在请求的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])) {
    ...
}

<强>参考文献:

trim()
isset()