看到有 Java 工程師在學 PHP 遇到變數初始化的問題,覺得有趣,做個筆記順便複習 PHP 的特性。
Java 是強型別 (strong type) 的程式語言,所有的變數在使用之前都必須給資料型態以及初始值;PHP 則是弱型別,就算不給值、不給資料型態也沒差,interpreter 會在 runtime 的時候自動做型別轉換在繼續執行程式。我想 PHP 這一特性就會讓很多 Java 工程師決得很莫名其妙吧,沒定義的變數到底要怎麼用?執行的時候真的不會出事嗎? (其實就是會 XD)
先來看正常的寫法:
$x = 'hello';
var_dump($x); // "hello"
如果變數沒有給值會發生什麼事?
var_dump($x); // NULL
PHP 把沒有初始化的變數帶入 NULL 來使用,連錯誤訊息都沒噴耶?其實有,只是要調整一下 error reporting 的 level:
error_reporting(E_ALL);
var_dump($x);
// Notice: Undefined variable: x
// NULL
如果拿一個完全沒有被初始化的變數做運算,interpreter 到底會怎麼轉型:
var_dump('123' . $x); // "123"
$x[] = '123';
var_dump($x); // array([0] => "123")
好像很強耶,居然會自動轉陣列!那換個方式來玩玩看:
$list = [1, 2, 3];
array_merge($list, $x);
// PHP Warning: array_merge(): Argument #2 is not an array
其實還是會遇到 interpreter 沒辦法幫你作主的時候。
以 PHP 這類的弱型別寫法,比較保險的作法就是去檢查要被使用的變數到底是否有初始化:
if (isset($x)) {
var_dump($x);
} else {
echo 'undefine';
}
// "undefine"
所以使用 PHP 寫程式時變數到底是否需要初始化?其實可以不用,但是若要保險起見 (防禦性程式設計),要用到的變數建議都要初始化、或是做檢查。StackOverflow 上也有提到: