我从未确定过的是在PHP中要进行多少次变量检查。例如,采取以下代码。我在分配它们之前没有检查任何变量,或者将它们传递给函数以查看它们是否包含我期望的变量
$carId = '12';
$aCar = fetchCar($carId);
$make = $aCar['make'];
$model = $aCar['model'];
$yearMade = $aCar['year'];
$age = calcAge($yearMade);
现在,如果我添加一些支票
$carId = '12';
if(is_numeric($carId))
{
$aCar = fetchCar($carId);
if(isset($aCar['make']) && is_string($aCar['make']))
{
$make = $aCar['make'];
}
else
{
//Report error
}
if(isset($aCar['model']) && is_string($aCar['model']))
{
$model = $aCar['model'];
}
else
{
//Report error
}
if(isset($aCar['year']) && is_numeric($aCar['year']))
{
$yearMade = $aCar['year'];
$age = calcAge($yearMade);
}
else
{
//Report error
}
}
else
{
//Report errors
}
代码现在更好但是有点过分和膨胀?我应该做这么多检查吗?
如果我不应该做这么多检查,你在哪里划清你应该和不应该检查的界限?
答案 0 :(得分:4)
这是动态类型语言的两难选择。 它在很大程度上取决于fetchCar()函数的作用。
我将采取的方法是假设fetchCar返回一个汽车数组或抛出异常。 如果将它与良好的异常处理逻辑相结合,最终可以获得干净稳定的代码。
例如:
function fetchCar($id) {
$car = queryDatabaseSomehow();
if (empty($car)) {
throw new ExceptionNotFound();
}
//eventually you can put your type checking here?
if (!isset($car['x']) || !is_string($car['x'])) {
throw new ExceptionDb();
}
}
echo fetchCar(3)['make'];
此外,如果你想做到超级合适并且完全是OOP,那么Car应该成为一个以make,model和year为成员的班级。 fetchCar()将返回Car或抛出异常。但当然,这并不总是可取的。
答案 1 :(得分:0)
我宁愿把它全部变成一个可以在这些情况下重复使用的函数。
function check_keys($arr_check, $arr_cond) {
$boo_success = TRUE;
foreach(array_keys($arr_cond) as $h)
if (in_array($arr_cond[$h], array('is_string', 'is_numeric'))) {
if ( ! isset($arr_check[$h]) or ! ($arr_cond[$h]($arr_check[$h]))) {
$boo_success = FALSE;
echo "The key {$h} is missing!";
// If run through a class, $this->errors[] = 'error message';
}
} else {
$boo_success = FALSE;
echo 'Invalid function';
}
return $boo_success;
}
$arr_keys = array('make' => 'is_string',
'model' => 'is_string',
'year' => 'is_numeric');
if (check_keys($aCar, $arr_keys)) {
// Run successful stuff
}
答案 2 :(得分:0)
有些人没有注意到的一个问题。警惕使用is_string
:
<?php
$var = "test";
$var['something'] = 2;
if(is_string($var['something'])) {
echo "Hello world!"; // Will echo this because $var is a string!
} else {
echo "Hello hell!";
}
echo "<br/>";
echo $var['something']; // returns 2
?>
与此相比:
$var = array('something' => 2);
if(is_string($var['something'])) {
echo "Hello world!"; // $var is now an array
} else if (is_numeric($var['something'])) {
echo "Hello hell!"; // Will echo this because $var is string!
}
echo "<br/>";
echo $var['something'];
您需要检查$var
是否为数组,因为它可能会给您带来意想不到的结果。 isset($var['something'])
将在第一个示例中返回true。
要回答你的问题,我认为这些检查不是太多。这实际上取决于fetchCar()
做什么以及如何获取数据。如果您不相信它(比如,它基于用户数据),那么您应该执行所有这些检查。如果没有,那么真的没有意义。