PHP处理可能未设置的变量的最佳方法是什么?
我有一个foreach循环,它将遍历一个数组,但根据这个特定应用程序的逻辑,数组可能不存在。PHP处理可能未设置的变量的最佳方法是什么?
我的问题涉及到我想最好的做法,例如,是否确定要做到这一点:
if (isset($array))
{
foreach($array as $something)
{
//do something
}
}
看来凌乱的我,但在这种情况下,如果我不这样做,它的错误的foreach。我应该传递一个空数组吗?我没有发布特定的代码,因为它是关于处理可能或可能不会设置变量的一般问题。
只是要注意:这里是'最安全'的方式。
if (isset($array) && is_array($array)) {
foreach ($array as $item) {
// ...
}
}
这是一个好方法。 +1 – Stephen 2010-08-14 03:20:30
尝试:
if(!empty($array))
{
foreach($array as $row)
{
// do something
}
}
这与isset一样糟糕,因为如果存在一个值集并且它不是一个数组,coede将继续并可能产生不可预测的结果。 – prodigitalson 2010-08-14 03:10:02
@prodigitalson我不得不说,如果变量可能包含一个数组,或可能包含其他类似字符串,或可能不存在....你做错了什么。 – Stephen 2010-08-14 03:13:07
是的,这就是我对isset/empty的想法,你真的需要了解它们的确切目的..但是,也像你说的那样,变量可能包含不同的东西。你在什么地方确保数据是正确的类型?我认为'类型检查'或什么?当人们说PHP是一种loosley类型的语言时,它是什么意思?从某种意义上说,它将允许你交换数据类型,而其他一些语言则要求你声明它们等。 – Tim 2010-08-14 03:18:11
这不是凌乱的。事实上,这是最好的做法。如果我不得不指出任何杂乱的东西,那就是使用Allman支架风格,但那是个人喜好。 (我是一个1TBS的那种人);)
我通常会做到这一点在我所有的类方法:
public function do_stuff ($param = NULL) {
if (!empty($param)) {
// do stuff
}
}
字空了()。有些情况下,isset更可取,但如果变量没有设置,或者它包含“空”值,如空字符串或数字0,则为空。
如果您传递一个空数组以便foreach很好,但如果你传递一个未初始化的数组变量,那么它将产生错误。
当数组为空或甚至未初始化时,它将工作。
if(!empty($array) && is_array($array)) {
foreach(...)
}
如果'$ array'不是空的,而是不是数组,则会产生警告。 – NullUserException 2010-08-14 03:18:27
@NullUserException:是的你是对的,但我想当你使用一个名为“数组”的变量,那么它可能只是数组或你忘了初始化根据问题。无论如何,** is_array **条件是可以的。 – NAVEED 2010-08-14 03:25:10
没有什么能阻止我说'$ array = null',是吗? – NullUserException 2010-08-14 03:26:13
我会说这是很好的做法,被设置为0(PHP的错误),以启动一个“布尔”等价值,任何时间部分功能添加到这个数组,添加+1布尔,所以你会有一个明确的方法来知道你是否应该搞乱数组?
这就是我在面向对象语言中采用的方法,在PHP中它可能会变得更加混乱,但我仍然发现最好有一个故意变量保持跟踪,而不是尝试分析数组本身。理想情况下,如果这个变量总是一个数组,将第一个值设置为0,并将其用作标志:
<?PHP
//somewhere in initialization
$myArray[0] = 0;
...
//somewhere inside an if statement that fills up the array
$myArray[0]++;
$myArray[1] = someValue;
//somewhere later in the game:
if($myArray[0] > 0){ //check if this array should be processed or not
foreach($myArray as $row){ //start up the for loop
if(! $skippedFirstRow){ //$skippedFirstRow will be false the first try
$skippedFirstRow++; //now $skippedFirstRow will be true
continue; //this will skip to the next iteration of the loop
}
//process remaining rows - nothing will happen here for that first placeholder row
}
}
?>
只是一个说明 - 你应该尽量避免这样做,上述方法是最后的手段,因为它肯定还是很混乱。 – 2010-08-14 04:28:14
他在问什么是检查变量是否是数组的最佳做法。我不确定在什么情况下你的代码是有意义的。 0不是PHP的错误:false(或FALSE)是PHP的错误,您为什么会将其他正常数组中的第一个元素设置为false?这段代码试图完成什么? – 2010-08-14 04:31:23
好吧,PHP的真/假生锈了一点,不管这个还是有效的。 如果您再次阅读该问题,他正在讨论可能存在或不存在的数组,并使用此数组的存在作为逻辑决策。我会说,对于任何主要的代码来说,在任何情况下使用数组的存在都不是好习惯,你应该制作一个变量来跟踪它。在这种情况下,我选择将true/false作为1/0存储在数组本身中。 再次阅读代码,你应该能够弄清楚它是如何工作的,我彻底评论过。 – 2010-08-15 00:12:13
为什么不设置'$ array'?你能给个例子吗? – strager 2010-08-14 03:12:56