2012-07-18 59 views
3

我最近不得不做的工作「測試」,和我反饋說,這種說法是不正確的:

$images = $flickr->get_images(5, !empty($_GET['pg']) ? $_GET['pg'] : 1); 

的「應該」錯誤是在第一次加載頁面時通過三元運算符生成的,因爲沒有通過查詢字符串傳遞的「?pg = 1」(或其他)。

反饋說我應該用isset代替。我看過這裏的各種帖子(question 1960509)和博客,但找不到任何明確的答案。

這真的是錯誤嗎?我怎樣才能複製這個問題?我需要把E_STRICT或我的php.ini文件中的東西?或者這可能是由於舊版本的PHP?

請注意:請不要告訴我應該如何驗證事情..我知道這...這是一個測試,看看我是否可以使用flickr API調用。

+1

'空()'隱式調用'isset()函數'(或抑制的錯誤,我不知道它) - [證明](http://codepad.org/jlTnQbFw )。你的代碼是正確的,正是我所要做的。它當然不會產生任何錯誤。 – DaveRandom 2012-07-18 11:14:54

+0

嗯,我已經去了@is_int($ _ GET ['pg']) – symcbean 2012-07-18 11:59:45

回答

4

這是非常好的。 empty不是一個實際的功能,它是一種語言結構。如果未設置變量,則不會發出警告(在這種情況下,該變量被視爲空,因此'函數'會根據您的需要返回TRUE),並且還檢查空值或零值。

你可以看到empty作爲一個正常的isset檢查與額外寬鬆比較FALSE

empty($var) === (!isset($var) || $var == FALSE) 
+0

感謝Joost.From所有我讀到的,它似乎表明'empty()'在這裏使用完全沒問題。我在星期五與我的「測試人員」會面,我將看到他是如何得到這個錯誤的。 – btwong 2012-07-18 11:21:37

0

$圖像= $ flickr-> get_images(5,(isset($ _ GET [ 'PG'] & &($ _GET [ 'PG'])))$ _GET [ 'PG']:1);

沒有isset你會得到錯誤,所以結合他們

0

我會使用

$images = $flickr->get_images(5, array_key_exists('pg', $_GET) ? $_GET['pg'] : 1); 

如果需要用!empty($_GET['pg'])結合(即array_key_exists('pg', $_GET) && !empty($_GET['pg'])),但array_key_exists是此作業的預期功能。

0

,你會得到原因的錯誤是因爲空的功能設計來檢查值現有變量的,whearas isset()函數旨在告訴你一個變量是否已經被實例化,但是由於空()在技術上是一種語言構造,它不會拋出錯誤或創建警告,因此大多數人看不到差異。

docs

empty() is the opposite of (boolean) var, except that no warning is generated when the variable is not set. 
0

我覺得在這樣isset的情況是,因爲它是檢查數組元素的存在,而不是檢查使用正確的函數,如果值該元素已被設置。正如馬丁所指出的那樣,這裏要做的最好的事情就是將它們結合起來,因爲如果元素存在,這將僅檢查值,這意味着錯誤不會在第一頁加載時發生。

另外,我覺得這樣只會發出警告,如果E_NOTICE是(或者E_WARNING以及)

+0

它不會引發任何類型的錯誤或警告,'empty'不是函數,再加上Dave的評論和Joost的回答中有一個很好的總結。 – 2012-07-18 11:15:00

+0

@ N.B .:我糾正了。在這裏發表關於duff信息的道歉。 – hellsgate 2012-07-18 13:33:43