2010-07-09 142 views
1

我正在使用PHP的全局聲明來爲腳本中的許多函數提供一個數組。該變量在腳本的頂部聲明,並在每其中使用它的功能的全球參考,具體如下:PHP全局聲明

<?php 

$myarray = array(1, 2, 3); 

function print_my_array() { 
    global $myarray; 

    print '<ul>'; 
    foreach($myarray as $entry) { 
     print '<li>'.$entry.'</li>'; 
    } 
    print '</ul>'; 

    return 0; 
} 

print_my_array(); 

?> 

有時,但並非總是如此,該陣列沒有設置當函數被調用,當foreach被調用時產生一個錯誤。在實際的代碼中,所使用的數組具有非常獨特的名稱,因此不應該與其他任何事件發生衝突。我是否錯誤地使用全球聲明?

+0

我結束了剛剛定義一個返回有問題的數組的函數。這在該函數的範圍內保護了數組,但允許我將它定義在我想要的位置。 – 2010-07-13 18:59:58

回答

4

不,該代碼段是正確的。您遇到的問題是使用全局變量的問題 - 可以從任何地方訪問和更改它們(可能是偶然的),從而創建難以發現的錯誤。

+0

+1傳道,兄弟 – 2010-07-09 17:25:41

+0

一般來說,我會同意你的看法,但這個'全局'變量實際上只用於一個場景中的一個腳本。爲什麼不直接在那裏定義呢?它需要在腳本頂部的可見位置進行定義,但它在頁面下方以掩埋方式使用。沒有機會在其他地方使用或訪問它,所以我仍然認爲我的問題沒有得到答覆。 – 2010-07-13 18:59:01

+0

再次,您的代碼段是正確的。數組有時可能爲null的唯一方法是,如果在定義和對'print_my_array'的任何調用之間發生了某些事情。 – Artefacto 2010-07-13 19:13:22

0

您最少可以做的是在運行foreach之前檢查函數頂部的數組是否爲空。至少可以防止錯誤:

function print_my_array() { 
    global $myarray; 

    if(!empty($myarray)) { 
     print '<ul>'; 
     foreach($myarray as $entry) { 
      print '<li>'.$entry.'</li>'; 
     } 
     print '</ul>'; 
    } 
} 

此外,我不會只是返回0爲它的地獄。您可能想要將數組是否爲空,並將其從此函數返回。

+0

這是一個明智的做法,但我需要定義該數組才能使腳本的其餘部分正常工作。沒有定義它不是一個選項。 – 2010-07-13 18:56:56

1

通過使用全局變量,你可以點擊幾個陷阱,他們也會讓你的代碼更少重用。

下面是一個可以在整個站點多次重複使用的函數示例。

(未經測試)

<?php 
function arrayTags($items, $open = '<li>', $close = '</li>') 
{ 
    if (is_array($items) && count($items) != 0) 
    { 
     $output = null; 

     foreach ($items as $item) { 
      $output .= $open . $item . $close; 
     } 

     return $output; 
    } 
    else 
    { 
     return ''; 
    } 
} 

// Default, <li> 
echo '<ul>' . arrayTags($myarray) . '</ul>'; 

// or, spans: 
echo '<div id="container">' . arrayTags($myarray, '<span>', '</span>') . '</div>'; 
0
$myarray = array(1, 2, 3); 

總之你只能這樣聲明:

$myarray = array(); 

,如果你想用值來填充它做的是,在類的構造函數:

public function __construct(){ 
    $myarray = array(1,2,3); 
} 

我不是大師,但在我的經驗看來,PHP似乎不喜歡在類內的函數之外執行函數調用。

這不起作用:

class MyClass { 
    public $mystring = myfunction(); 

    public function myFunction(){ 
     return true; //and your function code 
    } 
} 

所以當你使用數組(),它實際上並沒有引發任何函數調用,它只是外幣類型的數組的空變量。當你使用數組(1,2,3)時,它必須有效地運行「創建數組」,這就像一個函數。

我知道煩人,我希望它有所不同,但我不知道在php中做什麼的方式。讓我知道如果有一個很好的方式,我很樂意聽到它!