PHP 5.4新特性
掌握
traits
trait的引入,可以擴展class的內容,使class在某種形式上實現了多重繼承,更加靈活
trait不能被實例化
範例程式碼:
-
trait Hello {
- public function sayHello() {
- echo 'Hello ' . "n";
- }
- }
- trait World {
- public function sayWorld() {
- echo 'World' . "n";
- }
- }
- class MyHelloWorld {
- use Hello, World; 🎜> public function sayExclamationMark() {
- echo '!' . "n";
- }
- }
- $o = new MyHelloWorld();
- $o->sayHello();
- $o->sayWorld();
- $o->sayExclamationMark();
-
-
複製程式碼
要注意的是,trait的繼承順序:
來自目前類別的成員覆寫了 trait 的方法,而 trait 則覆寫了被繼承的方法
當多個trait被同一個類別使用的時候,會出現方法衝突的情況,使用關鍵字insteadof解決
範例程式碼:
trait A {- public function smallTalk() {
- echo 'a';
- }
- public function bigTalk() {
- echo 'A';
- }
- }
- trait B {
- public function smallTalk() {
- echo 'b';
- }
- () {
- echo 'B';
- }
- }
- class Talker {
- use A, B {
- B::smallTalk insteadof A;
- A::bigTalk insteadof B;
- }
- }
- class Aliased_Talker {
- use A, B {
- B::smallTalk insteadof A;
- A::bigTalk insteadof B;
- B: :bigTalk as talk;
- }
- }
-
-
複製程式碼
新增短數組語法
$a = [1, 2, 3, 4];- $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
-
-
複製程式碼
新增支援對函數傳回陣列的成員存取解析
function foo()- {
- return array(1,3,4,5);
- }
- $var =foo()[0];
-
-
複製程式碼
現在不管是否設定 short_open_tag php.ini 選項,= 將總是可用= 将总是可用
新增在實例化時存取類別成員
class Test- {
- public function foo()
- {
- //todo
- return 1;
- {
- //todo
- return 1;
- {
- //todo
return 1; { //todo return 1; { //todo return 1; { //todo return 1; { //todo 1; }}$var = (new Test)->foo();
複製程式碼
ps:注意括號
SESSION 擴充現在能追蹤檔案的 上傳進度
在php.ini配置session.upload_progress.enabled = On,
就會開啟檔案上傳進度追蹤功能
max_input_vars 指令
在php.ini檔案中,設定max_input_vars的值,
控制$_GET、$_POST 和 $_COOKIE的最大長度-
降低構造哈希碰撞進行拒絕服務攻擊的可能性
-
-
-
- 了解
-
-
-
- 現在閉包支援 $this
-
- 現在支援 Class::{expr}() 語法
-
-
範例程式碼:
-
-
-
class Utils { public static function test1() { echo 1; } } public static function test2() { echo 2; }}$m = 'test';Utils::{$m . (10-8)} ();Utils::test2(); 複製程式碼 新增二元直接量,例如:0b001001101
PHP 5.5新特性
掌握
opcache整合在php發行包
opcache其實是zend公司的Zend Optimizer Plus,功能類同apc
它的性能優於apc,對opcode進行了優化,關於opcache的更多資訊
請移步鳥哥部落格
一個關於Zend O 的小分享
因此在安裝PHP的時候,編譯參數一定要加上
- --enabled-opcache
- 建議設定(php.ini)
- zend_extension=opcache.so
- opcache.enable_cli=1
- opcachememory_pache. 128 //共享記憶體大小, 這個根據你們的需求可調
- opcache.interned_strings_buffer=8 //interned string的記憶體大小, 也可調
- opcache.max_accelerated_files=4000 //最大快取的檔案數目
- opcache.revalidate_freq=60 //60s檢查一次檔案更新
- opcache.fast_shutdown=1 //開啟快速關閉, 打開這個在PHP Request Shutdown的時候,回收記憶體的速度會提高
- opcache.save_comments=0 //不儲存檔案/函數的註解
-
複製程式碼
生成器(Generators)
熟悉python的同學對生成器絕對不會陌生的
其功能是在函數中使用關鍵字yield,中斷函數執行並傳回一個能在foreach中使用的迭代器
這個語法應該是PHP5.5中最令人興奮的特性了
下面的程式碼示範了生成器用法,並且做了對比,用來突出生成器的優勢
-
ini_set('memory_limit', '512M');
- $cmd = isset($argv[1]) ? (int)$argv[ 1] : 0;
-
- function xrange($start, $end, $step = 1)
- {
- if($start {
- if( $step {
- throw new LogicException('step must be ve');
- }
- for($i = $start; $i {
- yield $i;
- }
- }else{
- if($step >= 0)
- {
- throw new LogicException('step must be -ve');
- }
- for($i = $start; $i >= $end; $i = $i $step)
- {
- yield $i;
- }
- }
- }
-
- if($cmd == 0)
- {
- $r = range(1, 1000000);
- foreach($r as $ v)
- {
- if($v > 20)
- {
- break;
- }
- echo "$vt";
- }
- $m = memory_getget_usage( true);
- echo "n" . $m/1014/1024 . "Mn";
- }else if($cmd == 1){
- $r = xrange(1, 1000000);
- foreach($r as $v)
- {
- if($v > 20)
- {
- break;
- }
- echo "$vt";
- }
- $m = memory_get_usage(true);
- echo "n" . $m / 1014 /1024 . "Mn";
- }else{
- include 'php-excel.class.php';
- $stime = microtime(true);
- if($cmd == 3)
- {
- $data = array();
- for($i = 0; $i {
- $data[] = range(1,100);
- }
- $xls = new Excel_XML();
- $xls->addWorksheet('test', $ data);
- $xls->writeWorkbook('test.xls', './');
- }else{
- $data = function($n = 10000){
- for($ i = 0; $i {
- yield xrange(1,100);
- }
- };
- $xls = new Excel_XML();
- $ xls->addWorksheet('test', $data());
- $xls->writeWorkbook('test.xls', './');
- }
- $ctime = microtime(true) - $stime;
- $m = memory_get_usage(true);
- echo "n" . $m / 1014 /1024 . "Mn";
- echo "cost time:" . $ctime . "sn" ;
- }
-
複製程式碼
ps:php-excel.class.php檔案內容請參考本gist
php-excel.php
新增 finally 關鍵字
範例程式碼:
-
function getLines($file)
- {
- $f = fopen($file, 'r');
- try
- $f = fopen($file, 'r');
- try
- {
- while ($line = fgets($f))
- {
- yield $line;
- }
- } finally {
- fclose($f);
- }
- }
- foreach(getLines('finally.php') as $v)
- {
- echo $v;
}
複製程式碼 編寫程式碼的時候,一定要養成良好的習慣,及時的釋放打開的資源
password API
password系列函數,為我們儲存密碼,實現了更簡單安全的方式
密碼的儲存從明文到md5到md5 salt,到mcrpty salt
password_hash預設使用bcrypt加密演算法,自動產生salt,加密密碼
範例程式碼
-
$pw1 = '123456';
- $pwdb = password_hash($pw1, PASSWORD_DEFAULT);
- ";
- var_dump(password_verify($pw1, $pwdb)) . "n";
- $pw2 = '778920';
- $pwdb = password_hash($pw2, PASSWORD_DEFAULT);var_dump(password_verify($pw1, $pwdb)) . "n";
-
-
複製程式碼
複製程式碼
複製程式碼 複製程式碼
-
- 複製程式碼
-
-
- 強烈建議新應用開發密碼儲存使用內建password系列函數
-
- array_column
-
-
這個函數早就應該有了
-
我們從資料庫中取出10筆記錄,想要拿到這十筆記錄中的指定某一列,之前只能foreach了
-
現在只需要一個array_coulum函數搞定,這個函數實際意義很大,單獨提出來講了
-
範例程式碼:
-
-
-
-
// Array representing a possible record set returned from a database
- $records = array(
- array(
- '$records = array(
- array(
- '$record' > 2135,
- 'first_name' => 'John',
- 'last_name' => 'Doe',
- ),
- array(
- 'id' => 3245,
'first_name' => 'Sally', 'last_name' => 'Smith', ), array( 'id' => 5342, 'first_name' => 'id' => 5342, 'first_name' => 'id' => 5342, 'first_name' => 'id' => 5342, 'first_name' => 'id' => 5342, 'first_name' => 'id' => 5342, 'first_name' => 'id' => 'id Jane', 'last_name' => 'Jones', ), array( 'id' => 5623, 'first_name' => 'Peter',- 'last_name' => 'Doe',
- )
- );
- $first_names = array_column($records, 'first_name');
- print_r($first_names);
-
-
- 複製程式碼
-
-
-
熟悉
foreach 現在支援 list()
$arr= array( array(1,2,3), array(1,2,3), array(1,2,3), );foreach($arr as list($a, $b, $c)) { //todo }
複製程式碼
要注意的是,遍歷數組的子數組個數要一樣
empty() 支援任意表達式,函數呼叫也可以使用empty了
了解
|