作者JohnRoyer (Zero 日落)
看板PHP
標題Re: [請益] PHP變數宣告
時間Wed Nov 15 12:37:41 2017
: 因為我之前是寫Java的
Java 算是強型別的程式語言 (strong type)
而 PHP 則是弱型別 (weak type)
二者不太能互相比較
: 但是在PHP內
: 變成是要直接給變數然後給值初始化
: 如果沒有給值就等於null
: $x; //這樣有寫跟沒寫一樣,值也是null
: $x = 10; //正常
寫個程式做檢查,這邊先把 error_reporting 打開:
<?php
error_reporting(E_ALL);
var_dump($x);
執行後會出現訊息:
PHP Notice: Undefined variable: x in /home/johnroyer/tmp/qwe.php on line 5
NULL
所以其實 PHP 是會檢查變數是否有被初始化的
只是即使沒有被初始化也是可以照常拿來使用 .... 然後可能就踩到雷 XD
例如拿沒有初始化的變數去其他函式使用:
$list = [1, 2, 3];
array_merge($list, $undefined);
語法上來講沒有任何問題
但是執行的時候就會有 runtime error :
PHP Warning: array_merge(): Argument #2 is not an array
以個人經驗
如果希望程式可以避開 runtime error 的話
建議會拿來做判斷、運算的變數最好都先初始化
並且指定正確的資料型態
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 211.72.229.31
※ 文章網址: https://webptt.com/m.aspx?n=bbs/PHP/M.1510720665.A.045.html
※ 編輯: JohnRoyer (211.72.229.31), 11/15/2017 12:46:11
1F:推 ericdoctor: 謝謝你的回文 我理解強型態與弱型態語言,因為本身是F 11/15 15:53
2F:→ ericdoctor: 2E,所以也有寫js,只是不太懂在PHP,宣告並賦值的行 11/15 15:53
3F:→ ericdoctor: 為應該怎麼用語言描述 11/15 15:53
4F:→ ericdoctor: 原來要把error_reporting打開才會看到error,謝謝告知 11/15 15:57
5F:→ ericdoctor: ,我也有爬文到相關的用法是說要使用前要先初始化,我 11/15 15:57
6F:→ ericdoctor: 也認同這一點,但是不知道有沒有建議的寫法(比如說我 11/15 15:57
7F:→ ericdoctor: 今天想用整數要先賦的值是0,想用字串就要先給空字串) 11/15 15:57
8F:→ ericdoctor: 或是有什麼關鍵字或資源可以跟原po請教 11/15 15:57
9F:→ MOONRAKER: 當然是要當什麼用就設什麼啊 初值設0.0下面當字串用 11/15 16:03
10F:→ MOONRAKER: 你是參加IOCCC嗎 11/15 16:03
11F:推 ericdoctor: 我具體講一下我的問題好了 11/15 18:43
12F:→ ericdoctor: 不好意思 這邊用Java表示 11/15 18:43
13F:→ ericdoctor: 有時候會這樣寫 11/15 18:43
14F:→ ericdoctor: int x; 11/15 18:43
15F:→ ericdoctor: if(條件){ x =10;}else if(){ x=11;} 11/15 18:43
16F:→ ericdoctor: 但是php只要 11/15 18:43
17F:→ ericdoctor: if(條件){ $x =10;}else if(){ $x=11;} 11/15 18:43
18F:→ ericdoctor: 揪能正常使用,不知道這樣的寫法是好的還是不好的 11/15 18:43
19F:→ tkdmaf: 樓上,你的寫法會引發nil的問題吧。 11/15 21:36
20F:→ tkdmaf: 你這樣萬一二個條件都不對不就崩了? 11/15 21:37
21F:推 ericdoctor: 的確還要再加上else才完成,我這邊只是省篇幅,抱歉造 11/15 21:53
22F:→ ericdoctor: 成誤解,主要是想請問這樣變數還有需要在if敘述之前初 11/15 21:53
23F:→ ericdoctor: 始化嗎? 11/15 21:53
24F:→ MOONRAKER: 你有執行路徑觀念吧?拿來php也是一樣 11/16 01:51
25F:→ MOONRAKER: 你確定nested if可以對應到所有狀況 當然可以不要初值 11/16 01:52
26F:→ MOONRAKER: 你不太確定 或者想保平安 像開車門之前先看後面一樣 11/16 01:53
27F:→ MOONRAKER: 那就把初值寫在前面 這樣起碼有個fail-safe 11/16 01:55
28F:→ MOONRAKER: 要考慮一下 這個code將來可能會交給別人 那時他會怎麼 11/16 01:59
29F:→ MOONRAKER: 修改 會不會在else後面再加東西讓他不能涵蓋所有狀況 11/16 02:02