PHP处理可能未设置的变量的最佳方法是什么?

问题描述:

我有一个foreach循环,它将遍历一个数组,但根据这个特定应用程序的逻辑,数组可能不存在。PHP处理可能未设置的变量的最佳方法是什么?

我的问题涉及到我想最好的做法,例如,是否确定要做到这一点:

if (isset($array)) 
{ 

    foreach($array as $something) 
    { 
     //do something 
    } 
} 

看来凌乱的我,但在这种情况下,如果我不这样做,它的错误的foreach。我应该传递一个空数组吗?我没有发布特定的代码,因为它是关于处理可能或可能不会设置变量的一般问题。

+0

为什么不设置'$ array'?你能给个例子吗? – strager 2010-08-14 03:12:56

只是要注意:这里是'最安全'的方式。

if (isset($array) && is_array($array)) { 
    foreach ($array as $item) { 
     // ... 
    } 
} 
+1

这是一个好方法。 +1 – Stephen 2010-08-14 03:20:30

尝试:

if(!empty($array)) 
{ 
    foreach($array as $row) 
    { 
     // do something 
    } 
} 
+1

这与isset一样糟糕,因为如果存在一个值集并且它不是一个数组,coede将继续并可能产生不可预测的结果。 – prodigitalson 2010-08-14 03:10:02

+2

@prodigitalson我不得不说,如果变量可能包含一个数组,或可能包含其他类似字符串,或可能不存在....你做错了什么。 – Stephen 2010-08-14 03:13:07

+0

是的,这就是我对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,则为空。

+0

ah男人,不要让我开始支撑造型,我只是切换到这一个,因为我读(我认为)Codeigniter指导方针谁推荐它大声笑 – Tim 2010-08-14 03:14:34

+0

@ user270797这很有趣!我的同事刚刚写了一些正则表达式查找和替换调用来解析整个codeigniter核心文件并将它们转换为1TBS,因为allman风格非常烦人! – Stephen 2010-08-14 03:16:41

+0

没有problamo!评论删除。 – Stephen 2010-08-14 03:17:33

如果您传递一个空数组以便foreach很好,但如果你传递一个未初始化的数组变量,那么它将产生错误。

当数组为空或甚至未初始化时,它将工作。

if(!empty($array) && is_array($array)) { 
    foreach(...) 
} 
+0

如果'$ array'不是空的,而是不是数组,则会产生警告。 – NullUserException 2010-08-14 03:18:27

+0

@NullUserException:是的你是对的,但我想当你使用一个名为“数组”的变量,那么它可能只是数组或你忘了初始化根据问题。无论如何,** is_array **条件是可以的。 – NAVEED 2010-08-14 03:25:10

+1

没有什么能阻止我说'$ 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 
     } 
} 
?> 
+0

只是一个说明 - 你应该尽量避免这样做,上述方法是最后的手段,因为它肯定还是很混乱。 – 2010-08-14 04:28:14

+0

他在问什么是检查变量是否是数组的最佳做法。我不确定在什么情况下你的代码是有意义的。 0不是PHP的错误:false(或FALSE)是PHP的错误,您为什么会将其他正常数组中的第一个元素设置为false?这段代码试图完成什么? – 2010-08-14 04:31:23

+0

好吧,PHP的真/假生锈了一点,不管这个还是有效的。 如果您再次阅读该问题,他正在讨论可能存在或不存在的数组,并使用此数组的存在作为逻辑决策。我会说,对于任何主要的代码来说,在任何情况下使用数组的存在都不是好习惯,你应该制作一个变量来跟踪它。在这种情况下,我选择将true/false作为1/0存储在数组本身中。 再次阅读代码,你应该能够弄清楚它是如何工作的,我彻底评论过。 – 2010-08-15 00:12:13