我一直在尝试PhpStorm,它似乎是一个很好的IDE。我注意到我在代码窗口一侧收到这些警告,告诉我可能没有定义变量。
基本示例
if (some logic here) {
$getStatus_SQL = 'SELECT status_ID, status_Name FROM myTable';
$getStatus_RS = $db_con->query($getStatus_SQL);
$statusOption = ''; <----------- Variable Defined Here -------------<
while ($status = $getStatus_RS->fetch_assoc()){
$statusName = $status['status_Name'];
if ($statusName == $taskStatus){
$statusOption .= '<option selected value="'.$status['status_ID'].'">'.$status['status_Name'].'</option>';
} else {
$statusOption .= '<option value="'.$status['status_ID'].'">'.$status['status_Name'].'</option>';
}
}
}
现在我在HTML中回显$statusOption
变量,这就是我收到警告的地方:
可能尚未定义变量$ statusOption
但是,如果我在&#34; If语句之外定义变量&#34;警告消失了。
实施例
$statusOption = NULL;
if (some logic here) {
$getStatus_SQL = 'SELECT status_ID, status_Name FROM myTable';
$getStatus_RS = $db_con->query($getStatus_SQL);
while ($status = $getStatus_RS->fetch_assoc()){
$statusName = $status['status_Name'];
if ($statusName == $taskStatus){
$statusOption .= '<option selected value="'.$status['status_ID'].'">'.$status['status_Name'].'</option>';
} else {
$statusOption .= '<option value="'.$status['status_ID'].'">'.$status['status_Name'].'</option>';
}
}
}
所以我的问题是
在if
或while
语句中使用变量之前定义变量是否是正确的编码技术?
答案 0 :(得分:2)
您在PHPStorm中收到该警告,因为有一个代码路径可能导致该变量无法定义。
在您的情况下,您已经(简化):
while ($getStatus_RS->fetch_assoc()){
$statusOption = 'something';
}
在这种情况下,导致变量保持未定义的代码路径是$getStatus_RS->fetch_assoc()
返回false-y值。在这种情况下,while
块中的任何内容都不会执行,并且永远不会定义$statusOption
。
另一种看待它的方式是:
if (rand(0,10) > 5) {
$foo = 'bar';
}
echo $foo;
PHPStorm会在此处发出相同的警告,因为在大约一半的情况下,$foo
将不会被定义。
在循环外定义变量以使其始终具有值只是解决警告的一种方法。如果您的查询没有提供有效的结果,或者将您的HTML包装在if(isset($statusOption))
块中,或者类似的话,其他的可能就是抛出异常。
答案 1 :(得分:1)
在PHP中,在使用它们之前不必定义变量或对象属性。使用未定义的变量意味着值null
。这将导致E_NOTICE
级别的日志消息,或者如果您尝试在未定义的对象上请求方法,它将为E_ERROR
并且执行将停止。
但是,确保在代码中始终定义变量是非常好的做法。在PHP中,这意味着不首先在条件语句中分配它们,并在类定义中声明对象属性。
这样做的原因是它确保变量始终设置为受控值。当原始程序员的意图在代码中明确定义并且不太可能导致意外行为时,对代码的未来编辑将更容易。例如,如果声明了另一个具有相同名称的变量,或者删除了设置该变量的条件。在最坏的情况下,缺少声明变量可能会带来安全风险。