PHP7是什麼鬼?
PHP7是PHP編程語言的一個主要版本,並號稱是開發Web應用程式的一次革命,可開發和交付移動企業和雲應用。此版本被認為是PHP在2004年發佈PHP5後最重要的變化。
		
			新功能
		
	
	- 
			改進的性能 - PHPNG代碼合併在PHP7中,這是比 PHP5快兩倍; 
- 
			降低記憶體消耗 - 優化後PHP7使用較少的資源; 
- 
			標量類型聲明 - 現在,參數和返回值類型可以被強制執行; 
- 
			一致性的64位支持 - 64位架構機器持續支持; 
- 
			改進異常層次結構 - 異常層次結構得到改善; 
- 
			許多致命錯誤轉換成異常 - 異常的範圍增大覆蓋為許多致命的錯誤轉化異常; 
- 
			安全亂數發生器 - 加入新的安全亂數生成器的API; 
- 
			已過時的API和擴展刪除 - 不同的舊的和不支持的應用程式和擴展,從最新的版本中刪除; 
- 
			null合併運算符(??)的新空合併運算符被加入;
- 
			返回和標量類型聲明支持返回類型和參數類型也被加入;
- 
			增加了對匿名匿名類的支持;
- 
			零成本聲明支持零成本加入斷言。
PHP7使用新的 Zend Engine 3.0 提高應用程式性能兩倍,比PHP5.6 低了 50% 的記憶體消耗。 它可以服務於更多的併發用戶,無需任何額外的硬體。考慮到當今的工作量 PHP7設計並重構。
		
			PHP7 - 性能
		
	
	Magento 1.9
Drupal 7
Wordpress 3.6
		
			動態語言的比較
		
	
	
		
			PHP7 - 環境設置
		
	
	- 
			Web伺服器 − PHP幾乎能與所有的Web伺服器軟體一起工作,包括微軟的Internet Information Server(IIS),但是最常用的是免費提供的Apache伺服器。 在這裏免費下載Apache − http://httpd.apache.org/download.cgi 
- 
			資料庫 − PHP幾乎能與所有的資料庫軟體工作,其中包括Oracle和Sybase,但最常用的是免費的MySQL資料庫。MySQL在這裏免費下載在 −http://www.mysql.com/downloads/ 
- 
			PHP分析器− 為了處理PHP腳本的說明必須安裝一個分析器,生成HTML輸出,可以發送到Web流覽器。本教學將指導您如何在您的電腦上安裝PHP解析器。 
		
			PHP解析器安裝
		
	
	在繼續之前,確保你有適當的環境設置在你的機器上,使用PHP開發Web程式是非常重要的。保存下麵的PHP檔在Apache的htdocs檔夾中。
phpinfo.php<?php phpinfo(); ?>
http://127.0.0.1/phpinfo.php
如果這顯示了PHP安裝相關資訊的頁面,那麼就意味著PHP和Web伺服器安裝正確。否則,您必須遵循特定程式在電腦上安裝PHP。
Apache配置
詳細請看這裏− Apache伺服器配置PHP
PHP.INI檔配置
Windows IIS配置
		
			PHP7 - 標量類型聲明
		
	
	- 
			強制 - 強制性是默認模式,不需要指定。 
- 
			嚴格 - 嚴格模式有明確的暗示。 
- 
			int 
- 
			float 
- 
			bool 
- 
			string 
- 
			interfaces 
- 
			array 
- 
			callable 
		
			示例 - 強制模式
		
	
<?php
// Coercive mode
function sum(int ...$ints)
{
   return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>
	9
		
			示例 - 嚴格模式
		
	
<?php
// Strict mode
declare(strict_types=1);
function sum(int ...$ints)
{
   return array_sum($ints);
}
print(sum(2, '3', 4.1));
?>
	Fatal error: Uncaught TypeError: Argument 2 passed to sum() must be of the type integer, string given, ...
		
			PHP7 - 返回類型聲明
		
	
	在PHP7中有一個新的功能,已引入返回類型聲明。返回類型聲明指定一個函數的返回值類型。以下類型返回類型是可以聲明的:
- 
			int 
- 
			float 
- 
			bool 
- 
			string 
- 
			interfaces 
- 
			array 
- 
			callable 
		
			示例 - 有效的返回類型
		
	
<?php
declare(strict_types=1);
function returnIntValue(int $value): int
{
   return $value;
}
print(returnIntValue(5));
?>
	5
		
			示例 - 無效的返回類型
		
	
<?php
declare(strict_types=1);
function returnIntValue(int $value): int
{
   return $value + 1.0;
}
print(returnIntValue(5));
?>
	Fatal error: Uncaught TypeError: Return value of returnIntValue() must be of the type integer, float returned...
		
			PHP7 - Null合併運算符
		
	
	PHP7一個新的功能,空合併運算符(??)已經推出。它是用來與isset()函數函數一起替換三元操作。如果存在且不是 NULL 空合併運算符返回它的第一個運算元;否則返回第二個運算元。
示例
<?php
// fetch the value of $_GET['user'] and returns 'not passed'
// if username is not passed
$username = $_GET['username'] ?? 'not passed';
print($username);
print("<br/>");
// Equivalent code using ternary operator
$username = isset($_GET['username']) ? $_GET['username'] : 'not passed';
print($username);
print("<br/>");
// Chaining ?? operation
$username = $_GET['username'] ?? $_POST['username'] ?? 'not passed';
print($username);
?>
	not passed not passed not passed
		
			PHP7飛船操作符
		
	
	在PHP7中有一個新的功能-飛船操作符相繼引入。它是用於比較兩個運算式。當第一個運算式較第二個運算式分別小於,等於或大於時它分別返回-1,0或1。
示例
<?php
//integer comparison
print( 1 <=> 1);print("<br/>");
print( 1 <=> 2);print("<br/>");
print( 2 <=> 1);print("<br/>");
print("<br/>");
//float comparison
print( 1.5 <=> 1.5);print("<br/>");
print( 1.5 <=> 2.5);print("<br/>");
print( 2.5 <=> 1.5);print("<br/>");
print("<br/>");
//string comparison
print( "a" <=> "a");print("<br/>");
print( "a" <=> "b");print("<br/>");
print( "b" <=> "a");print("<br/>");
?>
	這將在流覽器產生以下輸出 -
0 -1 1 0 -1 1 0 -1 1
		
			PHP7 - 常量數組
		
	
	數組常量現在可以使用 define() 函數定義。在PHP5.6中,它們只能使用const關鍵字定義。
示例
<?php
//define a array using define function
define('animals', [
   'dog',
   'cat',
   'bird'
]);
print(animals[1]);
?>
	這將在流覽器產生以下輸出 -
cat
		
			PHP7 - 匿名類
		
	
	匿名類現在可以使用 new class 來定義。匿名類可以使用來代替完整的類定義。
示例
<?php
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) {
      print($msg);
   }
});
$app->getLogger()->log("My first Log Message");
?>
	這將在流覽器產生以下輸出 -
My first Log Message
PHP7 - Closure::call()
Closure::call() 方法加入到臨時綁定(bindTo)的對象範圍,以簡便方式封閉和調用它 它相比綁定到PHP5.6性能更快。
示例 - PHP7之前版本
<?php
class A {
   private $x = 1;
}
// Define a closure Pre PHP 7 code
$getValue = function() {
   return $this->x;
};
// Bind a clousure
$value = $getValue->bindTo(new A, 'A');
print($value());
?>
	這將在流覽器產生以下輸出 -
1
示例-PHP7+
<?php
class A {
   private $x = 1;
}
// PHP 7+ code, Define
$value = function() {
   return $this->x;
};
print($value->call(new A));
?>
	這將在流覽器產生以下輸出 -
1
		
			PHP7- 過濾unserialize()
		
	
	PHP7引入了過濾 unserialize()函數以在反序列化不受信任的數據對象時提供更好的安全性。它可以防止可能的代碼注入,使開發人員能夠使用序列化白名單類。
示例
<?php
class MyClass1 {
   public $obj1prop;
}
class MyClass2 {
   public $obj2prop;
}
$obj1 = new MyClass1();
$obj1->obj1prop = 1;
$obj2 = new MyClass2();
$obj2->obj2prop = 2;
$serializedObj1 = serialize($obj1);
$serializedObj2 = serialize($obj2);
// default behaviour that accepts all classes
// second argument can be ommited.
// if allowed_classes is passed as false, unserialize converts all objects into __PHP_Incomplete_Class object
$data = unserialize($serializedObj1 , ["allowed_classes" => true]);
// converts all objects into __PHP_Incomplete_Class object except those of MyClass1 and MyClass2
$data2 = unserialize($serializedObj2 , ["allowed_classes" => ["MyClass1", "MyClass2"]]);
print($data->obj1prop);
print("<br/>");
print($data2->obj2prop);
?>
	這將在流覽器產生以下輸出 -
1 2
		
			PHP7 - 國際字元
		
	
	在PHP7,新的 IntlChar 類添加其目的是公開更多的ICU功能。 這個類定義了許多可用於操縱Unicode字元的靜態方法和常數。你需要在使用這個類之前安裝 Intl 擴展。
示例
<?php
printf('%x', IntlChar::CODEPOINT_MAX);
print (IntlChar::charName('@'));
print(IntlChar::ispunct('!'));
?>
	這將在流覽器產生以下輸出 -
10ffff COMMERCIAL AT true
PHP7 - CSPRNG
- 
			random_bytes() - 生成加密安全偽隨機位元組。 
- 
			random_int() - 生成加密安全偽隨機整數。 
random_bytes()
語法
string random_bytes ( int $length )
參數
- 
			length - 返回隨機串的位元組長度 
返回值
- 
			返回包含加密安全隨機位元組的請求數量的字串。
錯誤/異常
- 
			如果無法找到隨機性的適當源,將引發異常
- 
			如果給定參數無效,TypeError將被拋出
- 
			如果給出位元組長度無效,錯誤將被拋出
示例
<?php $bytes = random_bytes(5); print(bin2hex($bytes)); ?>
這將在流覽器產生以下輸出 -
54cc305593
random_int()
語法
int random_int ( int $min , int $max )
參數
- 
			min - 返回最小值,它必須是PHP_INT_MIN或更大的值 
- 
			max - 返回最大值,它必須是小於或等於PHP_INT_MAX 
返回值
- 
			返回最小值(min)到最大(max)的範圍內,包括加密安全隨機整數。
		
			錯誤/異常
		
	
	- 
			如果無法找到隨機性一個適當的源,將引發異常
- 
			如果給定參數無效,TypeError 將被拋出
- 
			如果 max 小於 min 時,錯誤將被拋出
示例
<?php
print(random_int(100, 999));
print("
");
print(random_int(-1000, 0));
?>
	這將在流覽器產生以下輸出 -
614 -882
		
			PHP7 - 期望
		
	
	期望是向後相容的增強到舊 assert() 函數。期望允許在生產代碼零成本的斷言,並提供在斷言失敗時拋出自定義異常的能力。assert() 不是一種語言構建體,其中第一個參數是一個運算式的比較字串或布爾用於測試。
		
			配置指令assert()
		
	
	| 指令 | 默認值 | 
						可能的值
					 | 
|---|---|---|
| zend.assertions | 1 | 
 | 
| assert.exception | 0 | 
 | 
參數
- 
			assertion - 斷言。在PHP 5中,這必須是要計算一個字串或要測試一個布爾值。 在PHP中7,這也可能是一個返回值的運算式,將執行和使用的結果,以指示斷言是成功還是失敗。 
- 
			description - 一個可選的描述,如果斷言失敗,將包括失敗消息。 
- 
			exception-在PHP7,第二個參數可以是一個 Throwable 對象,而不是一個描述字串,在這種情況下,這是如果斷言失敗和assert.exception配置指令啟用將拋出的對象。 
返回值
示例
<?php
ini_set('assert.exception', 1);
class CustomError extends AssertionError {}
assert(false, new CustomError('Custom Error Message!'));
?>
	這將在流覽器產生以下輸出 -
Fatal error: Uncaught CustomError: Custom Error Message! in...
PHP7 - use語句
示例
<?php
// Before PHP 7
use com\zaixian\ClassA;
use com\zaixian\ClassB;
use com\zaixian\ClassC as C;
use function com\zaixian\fn_a;
use function com\zaixian\fn_b;
use function com\zaixian\fn_c;
use const com\zaixian\ConstA;
use const com\zaixian\ConstB;
use const com\zaixian\ConstC;
// PHP 7+ code
use com\zaixian\{ClassA, ClassB, ClassC as C};
use function com\zaixian\{fn_a, fn_b, fn_c};
use const com\zaixian\{ConstA, ConstB, ConstC};
?>
	
		
			PHP7 - 錯誤處理
		
	
	從PHP7,錯誤處理和報告已經改變。PHP5中使用了傳統的錯誤報告機制的錯誤,現在大多數的錯誤將通過拋出異常錯誤處理。類似於異常,這些錯誤異常會冒泡,直到它們到達第一個匹配的catch塊。如果沒有匹配的塊,那麼會使用 set_exception_handler() 安裝一個默認的異常處理並被調用,並在情況下,如果沒有默認的異常處理程式,那麼該異常將被轉換為一個致命的錯誤,並會像傳統錯誤那樣處理。
由於 Error 層次結構不是從異常(Exception),代碼擴展使用catch (Exception $e) { ... } 塊來處理未捕獲的異常,PHP5中將不會處理這樣的錯誤。 catch (Error $e) { ... } 塊或 set_exception_handler()處理程式需要處理的致命錯誤。
示例
<?php
class MathOperations
{
   protected $n = 10;
   // Try to get the Division by Zero error object and display as Exception
   public function doOperation(): string
   {
      try {
         $value = $this->n % 0;
         return $value;
      } catch (DivisionByZeroError $e) {
         return $e->getMessage();
      }
   }
}
$mathOperationsObj = new MathOperations();
print($mathOperationsObj->doOperation());
?>
	Modulo by zero
		
			PHP7 - 整數除法
		
	
	示例
<?php
$value = intdiv(10,3);
var_dump($value);
print("
");
print($value);
?>
	這將在流覽器產生以下輸出 -
int(3) 3
PHP7 - Session選項
從PHP7+,session_start()函數接受數組參數覆蓋在php.ini中設置的會話配置指令。這些選項支持 session.lazy,在默認情況下如果PHP會話數據改變,那麼會覆蓋任何會話數據資訊。
添加另一種選擇是:read_and_close,這表明會話數據應被讀取,然後該會話應當立即被關閉不變。例如,session.cache_limiter 設置為私有,並設置標誌使用下麵的代碼片段之後立即關閉會話。<?php session_start([ 'cache_limiter' => 'private', 'read_and_close' => true, ]); ?>
		
			PHP7 - 棄用的功能
		
	
	
		
			PHP4風格的構造函數
		
	
	PHP4式構造函數,它與類的名稱相同,因為它們是在所定義類的方法,現在已過時,並且將在未來被移除。如果PHP4的構造僅僅是一個類中定義構造函數,PHP7將發出E_DEPRECATED。類實現構造函數 __construct()方法不受影響。
示例
<?php
class A {
   function A() {
      print('Style Constructor');
   }
}
?>
	這將在流覽器產生以下輸出 -
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; A has a deprecated constructor in...
		
			靜態調用非靜態方法
		
	
	示例
<?php
class A {
   function b() {
      print('Non-static call');
   }
}
A::b();
?>
	這將在流覽器產生以下輸出 -
Deprecated: Non-static method A::b() should not be called statically in... Non-static call
password_hash() salt 選項
password_hash()函數的salt選項已被棄用,使開發人員不會產生他們自己的(通常是不安全的)salt。函數本身生成一個加密的安全salt,在開發者沒有提供salt值時 - 因此,定制 salt 生成不再需要了。
capture_session_meta SSL上下文選項
PHP7已刪除的擴展
- 
			ereg 
- 
			mssql 
- 
			mysql 
- 
			sybase_ct 
PHP7已刪除的SAPI
- 
			aolserver 
- 
			apache 
- 
			apache_hooks 
- 
			apache2filter 
- 
			caudium 
- 
			continuity 
- 
			isapi 
- 
			milter 
- 
			nsapi 
