php7新特性學習
1、標量型別宣告
在函式/方法的引數及返回值處宣告資料型別為某個具體的資料型別,則必須傳入或返回對應的資料型別,否則會報錯。
function inputint(int $a)
{
echo $a;
}
function returnArray(): array
{
return [1, 2, 3, 4];
}
2、null合併運算子
在php中三元表示式和isset()大量使用,在php7中引入了null合併運算子??
,null合併運算子表示如果這個變數存在且值不為null,就返回該值,否則返回第二個運算元。
$username = isset($_GET['username']) ? $_GET['username'] : ''; //等價於 $username = $_GET['username'] ?? '';
//原格式
$expr=$expr1?$expr1:$expr2
//新格式
$expr=$expr1?:$expr2
3、太空船操作符
太空船操作符兩側為數值時,兩邊相等返回0,左側大於右側返回1,左側小於右側,返回-1。
太空船操作符兩側為字串時,按從左到右的順序比較兩邊字串對應位置的Ascii編碼表中數值,直到在同一位置能返回非0結果或最後一位返回結果。
// 整數 echo 1 <=> 1; // 0 當左邊等於右邊的時候,返回0 echo 1 <=> 2; // -1 當左邊小於右邊,返回-1 echo 2 <=> 1; // 1 當左邊大於右邊,返回1 // 浮點數 echo 1.5 <=> 1.5; // 0 echo 1.5 <=> 2.5; // -1 echo 2.5 <=> 1.5; // 1 // 字串 echo "a" <=> "a"; // 0 echo "a" <=> "b"; // -1 echo "b" <=> "a"; // 1
4、define定義陣列
define在之前的版本是不能定義陣列的,現在可以定義陣列了
define('CONFIG',[
'app_name' => 'application',
'namespace' => 'app'
]);
5、use方法,批量匯入
/ PHP 7 之前的程式碼 use app\namespace\ClassA; use app\namespace\ClassB; use app\namespace\ClassC as C; use function app\namespace\fn_a; use function app\namespace\fn_b; use function app\namespace\fn_c; use const app\namespace\ConstA; use const app\namespace\ConstB; use const app\namespace\ConstC; // PHP 7+ 及更高版本的程式碼 use app\namespace\{ClassA, ClassB, ClassC as C}; use function app\namespace\{fn_a, fn_b, fn_c}; use const app\namespace\{ConstA, ConstB, ConstC};
6、新的整除函式
intdiv()整除函式
var_dump(intdiv(10, 3));
//int(3)
7、為unserialize提供過濾
這個特性指在提供更安全的方式解包不可靠的資料,它通過白名單 的方式來防止潛在的程式碼注入。
// 轉換物件為 __PHP_Incomplete_Class 物件
$data = unserialize($foo, ["allowed_classes" => false]);
// 轉換物件為 __PHP_Incomplete_Class 物件,除了 MyClass 和 MyClass2,即過濾掉MyClass和MyClass2
$data = unserialize($foo, ["allowed_classes" => ["MyClass", "MyClass2"]);
// 預設接受所有類
$data = unserialize($foo, ["allowed_classes" => true]);
8、匿名類
現在支援通過new class來例項化一個匿名類。
interface Logger {
public function log(string $msg);
}
class Application {
private $logger;
public function getLogger(): Logger {
return $this->logger;
}
public function setLogger(Logger $logger) {
$this->logger = $logger;
}
}
$app = new Application;
$app->setLogger(**new class implements Logger {
public function log(string $msg) {
echo $msg;
}
}**);
var_dump($app->getLogger());
9、Unicode codepoint 轉譯語法
接受一個以16進位制形式的 Unicode codepoint,並打印出一個雙引號或heredoc包圍的 UTF-8 編碼格式的字串。 可以接受任何有效的 codepoint,並且開頭的 0 是可以省略的。
echo "\u{aa}"; //a
echo "\u{0000aa}"; //a
echo "\u{9999}"; //香
10、新增函式數函式random_bytes()、random_int()
random_bytes(int $length) 生成加密的偽隨機字串
random_int(int $min,int $max) 生成加密的偽隨機整數
11、生成器的返回值
在PHP5.5引入生成器的概念。生成器函式每執行一次就得到一個yield標識的值。在PHP7中,當生成器迭代完成後,可以獲取該生成器函式的返回值。通過Generator::getReturn()得到。
function generator() {
yield 1;
yield 2;
yield 3;
return "a";
}
$generatorClass = ("generator")();
foreach ($generatorClass as $val) {
echo $val.” “;
}
echo $generatorClass->getReturn();//1 2 3 a
在生成器中可以引入另一個或幾個生成器,只需要寫yield from functionName1
function generator1(){
yield 1;
yield 2;
yield from generator2();
yield from generator3();
}
function generator2(){
yield 3;
yield 4;
}
function generator3(){
yield 5;
yield 6;
}
foreach (generator1() as $val){
echo $val, " ";
}
12、foreach不再改變內部陣列指標
在PHP7之前,當陣列通過 foreach 迭代時,陣列指標會移動。現在開始,不再如此。
$array = [0, 1, 2];
foreach ($array as &$val) {
var_dump(current($array));
}
//PHP5輸出:
int(1)
int(2)
bool(false)
//PHP7輸出:
int(0)
int(0)
int(0)
當使用引用遍歷陣列時,現在 foreach 在迭代中能更好的跟蹤變化。例如,在迭代中新增一個迭代值到陣列中,參考下面的程式碼:
$array = [0];
foreach ($array as &$val) {
var_dump($val);
$array[1] = 1;
}
//PHP5輸出:
int(0)
//PHP7輸出:
int(0)
int(1)
13、十六進位制字串不再被認為是數字
含十六進位制字串不再被認為是數字
var_dump("0x123" == "291");
var_dump(is_numeric("0x123"));
var_dump("0xe" + "0x1");
var_dump(substr("foo", "0x1"));
//PHP5輸出:
bool(true)
bool(true)
int(15)
string(2) "oo"
//PHP7輸出:
bool(false)
bool(false)
int(0)
Notice: A non well formed numeric value encountered in /tmp/test.php on line 5
string(3) "foo"
14、被移除的函式
被移除的函式列表如下:
call_user_func() 和 call_user_func_array()從PHP 4.1.0開始被廢棄。
已廢棄的 mcrypt_generic_end() 函式已被移除,請使用mcrypt_generic_deinit()代替。
已廢棄的 mcrypt_ecb(), mcrypt_cbc(), mcrypt_cfb() 和 mcrypt_ofb() 函式已被移除。
set_magic_quotes_runtime(), 和它的別名 magic_quotes_runtime()已被移除. 它們在PHP 5.3.0中已經被廢棄,並且 在in PHP 5.4.0也由於魔術引號的廢棄而失去功能。
已廢棄的 set_socket_blocking() 函式已被移除,請使用stream_set_blocking()代替。
dl()在 PHP-FPM 不再可用,在 CLI 和 embed SAPIs 中仍可用。
GD庫中下列函式被移除:imagepsbbox()、imagepsencodefont()、imagepsextendfont()、imagepsfreefont()、imagepsloadfont()、imagepsslantfont()、imagepstext()
在配置檔案php.ini中,always_populate_raw_post_data、asp_tags、xsl.security_prefs被移除了。
15、new 操作符建立的物件不能以引用方式賦值給變數
class C {}
$c =& new C;
//PHP5輸出:
Deprecated: Assigning the return value of new by reference is deprecated in /tmp/test.php on line 3
//PHP7輸出:
Parse error: syntax error, unexpected 'new' (T_NEW) in /tmp/test.php on line 3
16、移除了類 ASP 和 類script 的PHP 標籤
使用類似 ASP 的標籤,以及 script 標籤來區分 PHP 程式碼的方式被移除。 受到影響的標籤有:<% %>、<%= %>、。
17、在數值溢位的時候,內部函式將會失敗
將浮點數轉換為整數的時候,如果浮點數值太大,導致無法以整數表達的情況下, 在之前的版本中,內部函式會直接將整數截斷,並不會引發錯誤。 在 PHP 7.0 中,如果發生這種情況,會引發 E_WARNING 錯誤,並且返回 NULL。
18、JSON 擴充套件已經被 JSOND 取代
JSON 擴充套件已經被 JSOND 擴充套件取代。 對於數值的處理,有以下兩點需要注意的:
第一,數值不能以點號(.)結束 (例如,數值 34. 必須寫作 34.0 或 34)。 第二,如果使用科學計數法表示數值,e 前面必須不是點號(.) (例如,3.e3 必須寫作 3.0e3 或 3e3)
19、INI 檔案中 # 註釋格式被移除
在配置檔案INI檔案中,不再支援以 # 開始的註釋行, 請使用 ;(分號)來表示註釋。 此變更適用於 php.ini 以及用 parse_ini_file() 和 parse_ini_string() 函式來處理的檔案。
20、$HTTP_RAW_POST_DATA 被移除
不再提供 $HTTP_RAW_POST_DATA 變數。 請使用 php://input 作為替代。
21、yield 變更為右聯接運算子
在使用 yield 關鍵字的時候,不再需要括號, 並且它變更為右聯接操作符,其運算子優先順序介於 print 和 => 之間。 這可能導致現有程式碼的行為發生改變。可以通過使用括號來消除歧義。
echo yield -1;
// 在之前版本中會被解釋為:
echo (yield) - 1;
// 現在,它將被解釋為:
echo yield (-1);
yield $foo or die;
// 在之前版本中會被解釋為:
yield ($foo or die);
// 現在,它將被解釋為:
(yield $foo) or die;