相关文章推荐
宽容的莲藕  ·  sqoop job 创建报错 Got ...·  5 月前    · 
乖乖的钱包  ·  java - ByteBuddy ...·  9 月前    · 
踏实的椰子  ·  No matching variant ...·  1 年前    · 
谦和的电影票  ·  Isotropic Light-Sheet ...·  1 年前    · 
阳刚的路灯  ·  使用 ...·  1 年前    · 

科技始終來自人性,function也是這樣。O-O(我知道我用很多顏文字,不過這裡是指Object-Oriented,物件導向)的起點也是因為以前的程式開發人員想要重複利用某些 function 而被發明。在前幾篇文章我們介紹了關於 Post 和 Get 的使用方法,以及 php 接收 Post 或 Get 的方法
最簡單的樣子是像下面的這個範例

$a = $_POST['userInput'];

如果不是很清楚這段 php 的意思,也可以參考 Day 9 的文章哦(`・ω・´)
總之,我們接收變數乍看只要這樣就可以解決。假如表單的變數數量有30個,豈不是要一堆變數才有辦法解決嗎_(√ ζ ε:)_
幸好,在 php 中有 extract() 這個 function 可以只用一行就把所有表單中的資料轉換成 php 中的變數(ノ>ω<)ノ

以 Day 9 當例子,HTML部分不變

<meta charset='utf-8'> </head> <form method="get" action="Foo.php"> <input type="text" name="account" placeholder="帳號"><br> <input type="password" name="password" placeholder="密碼"><br> <input type="submit" name="submit" value="送出"> </form> </body> </html>

PHP原本的樣子

$id = $_GET['account']; //取得表單 name 為 account 的內容 $pw = $_GET['password']; //取得表單 name 為 password 的內容 if($id == '史蒂夫'){ if($pw == '123'){ echo "歡迎".$id; }else{ echo "密碼錯誤"; }else{ echo "帳號錯誤";

可以等價交換成下面的樣子

extract($_GET); if($account == '史蒂夫'){ if($password == '123'){ echo "歡迎".$account; }else{ echo "密碼錯誤"; }else{ echo "帳號錯誤";

稍微解釋一下,不管 POST 或是 GET,對 PHP 來說都是一個集合陣列資料(在 Java 裡面類似 map ,Python 裡面類似 dictionary),extract 這個 function 會把集合中的 key 值直接變成變數名稱,value 則是變成變數值。對於 POST 或是 GET ,集合陣列中的 key 值會是 html 表單中的 name。

藏在牙縫裡的魔鬼

如果 extract 這個方法用得不好會出現一些問題。看一下例子

<meta charset='utf-8'> </head> <form method="post" action="Foo.php"> <label for="user">Name:num =</label> <input type="text" name="num" placeholder="任意字串"><br> <input type="submit" name="submit" value="送出"> </form> <img src=""> </body> </html>

PHP 的部分是這樣

$num=10; echo "extract前的num為:".$num."<br>"; extract($_POST); echo "extract後的num為:".$num."<br>";

用這個 PHP 比較一下 extract 前後 num 變數的變化,結果如下

如果直接使用 extract 的話,已經存在的變數會被取代。Σ(*゚д゚ノ)ノ
所以最好在使用的時候,加上下面幾個參數,大概列出幾個常用的。寫法會像這樣extract($_POST,參數)

  • EXTR_SKIP 忽略已存在的變數
  • EXTR_PREFIX_SAME 如果有已存在的變數,則在新的變數加上前缀字
  • EXTR_PREFIX_ALL 所有新加入變數都有前缀字
  •