掌握php
<?php 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解決
示例代碼:html
<?php trait A { public function smallTalk() { echo 'a'; } public function bigTalk() { echo 'A'; } } trait B { public function smallTalk() { echo 'b'; } public function bigTalk() { 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; } }
<?php $a = [1, 2, 3, 4]; $a = ['one' => 1, 'two' => 2, 'three' => 3, 'four' => 4];
<?php function foo() { return array(1,3,4,5); } $var =foo()[0];
如今無論是否設置 short_open_tag php.ini 選項,<?= 將老是可用python
新增在實例化時訪問類成員git
<?php class Test { public function foo() { //todo return 1; } } $var = (new Test)->foo();
ps:注意括號github
SESSION 擴展示在能追蹤文件的 上傳進度
在php.ini中配置session.upload_progress.enabled = On,
就會開啓文件上傳進度跟蹤功能web
max_input_vars 指令
在php.ini文件中,設定max_input_vars的值,
控制$_GET、$_POST 和 $_COOKIE的最大長度
下降構造哈希碰撞進行拒絕服務攻擊的可能性算法
瞭解數據庫
<?php class Utils { public static function test1() { echo 1; } public static function test2() { echo 2; } } $m = 'test'; Utils::{$m . (10-8)}(); Utils::test2();
掌握數組
--enabled-opcache 推薦配置(php.ini) zend_extension=opcache.so opcache.enable_cli=1 opcache.memory_consumption=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 //不保存文件/函數的註釋
<?php ini_set('memory_limit', '512M'); $cmd = isset($argv[1]) ? (int)$argv[1] : 0; function xrange($start, $end, $step = 1) { if($start <= $end) { if($step <= 0) { throw new LogicException('step must be +ve'); } for($i = $start; $i <= $end; $i = $i + $step) { 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 "$v\t"; } $m = memory_get_usage(true); echo "\n" . $m/1014/1024 . "M\n"; }else if($cmd == 1){ $r = xrange(1, 1000000); foreach($r as $v) { if($v > 20) { break; } echo "$v\t"; } $m = memory_get_usage(true); echo "\n" . $m / 1014 /1024 . "M\n"; }else{ include 'php-excel.class.php'; $stime = microtime(true); if($cmd == 3) { $data = array(); for($i = 0; $i < 10000;$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 < $n; $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 . "M\n"; echo "cost time:" . $ctime . "s\n"; }
ps:php-excel.class.php文件內容請參考本gist
php-excel.php緩存
<?php function getLines($file) { $f = fopen($file, 'r'); try { while ($line = fgets($f)) { yield $line; } } finally { fclose($f); } } foreach(getLines('finally.php') as $v) { echo $v; }
編寫代碼的時候,必定要養成良好的習慣,及時的釋放打開的資源
<?php $pw1 = '123456'; $pwdb = password_hash($pw1, PASSWORD_DEFAULT); var_dump($pwdb) . "\n"; var_dump(password_verify($pw1, $pwdb)) . "\n"; $pw2 = '778920'; $pwdb = password_hash($pw2, PASSWORD_DEFAULT); var_dump($pwdb) . "\n"; var_dump(password_verify($pw1, $pwdb)) . "\n";
強烈建議新應用開發密碼存儲使用內置password系列函數
<?php // Array representing a possible record set returned from a database $records = array( array( 'id' => 2135, 'first_name' => 'John', 'last_name' => 'Doe', ), array( 'id' => 3245, 'first_name' => 'Sally', 'last_name' => 'Smith', ), array( 'id' => 5342, 'first_name' => 'Jane', 'last_name' => 'Jones', ), array( 'id' => 5623, 'first_name' => 'Peter', 'last_name' => 'Doe', ) ); $first_names = array_column($records, 'first_name'); print_r($first_names);
熟悉
<?php $arr= array( array(1,2,3), array(1,2,3), array(1,2,3), ); foreach($arr as list($a, $b, $c)) { //todo }
須要注意的是,遍歷數組的子數組個數要同樣
瞭解
另外PHP5.4和PHP5.5新增的function,新增的class,新增的interface,新增的全局常量仍是挺多的
想了解的,能夠查看下面連接
http://www.php.net/manual/zh/migration55.new-functions.php
http://www.php.net/manual/zh/migration55.classes.php
http://www.php.net/manual/zh/migration55.new-methods.php
http://www.php.net/manual/zh/migration55.global-constants.php
http://www.php.net/manual/zh/migration54.functions.php
http://www.php.net/manual/zh/migration54.classes.php
http://www.php.net/manual/zh/migration54.methods.php
http://www.php.net/manual/zh/migration54.global-constants.php