掌握
<?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解决 示例代码:
<?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];
<?php
class Test
{
public function foo()
{
//todo
return 1;
}
}
$var = (new Test)->foo();
ps:注意括号
了解
<?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