原文1:http://blog.csdn.net/fenglailea/article/details/9853645 这个更全面
原文2:http://segmentfault.com/a/1190000002790818
个人在原文基础上总结的的常用的新特性。
//select.php <?php namespace Zend\Db\Table; class Select {} //call.php <?php //namespace Zend\Db; include('select.php'); $s = new Zend\Db\Table\Select(); $s->test();
在PHP5中,我们可以在类中通过self关键字或者__CLASS__来判断或调用当前类。但有一个问题,如果我们是在子类中调用,得到的结果将是父类。因为在继承父类的时候,静态成员就已经被绑定了。 例如:
<?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test();
数计算机程序设计语言中都支持无条件转向语句goto,当程序执行到goto语句时,即转向由goto语句中的标号指出的程序位置继续执行。尽管goto语句有可能会导致程序流程不清晰,可读性减弱,但在某些情况下具有其独特的方便之处,例如中断深度嵌套的循环和 if 语句。
<?php goto a; echo 'Foo'; a: echo 'Bar'; for($i=0,$j=50; $i<100; $i++) { while($j--) { if($j==17) goto end; } } echo "i = $i"; end: echo 'j hit 17';
闭包(Closure)函数和Lambda函数的概念来自于函数编程领域。例如JavaScript 是支持闭包和 lambda 函数的最常见语言之一。
在PHP中,我们也可以通过create_function()在代码运行时创建函数。但有一个问题:创建的函数仅在运行时才被编译,而不与其它代码同时被编译成执行码,因此我们无法使用类似APC这样的执行码缓存来提高代码执行效率。
在PHP5.3中,我们可以使用Lambda/匿名函数来定义一些临时使用(即用即弃型)的函数,以作为array_map()/array_walk()等函数的回调函数。
<?php echo preg_replace_callback('~-([a-z])~', function ($match) { return strtoupper($match[1]); }, 'hello-world'); // 输出 helloWorld $greet = function($name) { printf("Hello %s\r\n", $name); }; $greet('World'); $greet('PHP'); //...在某个类中 $callback = function ($quantity, $product) use ($tax, &$total) { $pricePerItem = constant(__CLASS__ . "::PRICE_" . strtoupper($product)); $total += ($pricePerItem * $quantity) * ($tax + 1.0); }; array_walk($products, $callback);
//PHP中定义常量通常是用这种方式 define("CONSTANT", "Hello world."); //并且新增了一种常量定义方式 const CONSTANT = 'Hello World';
原本格式为是(expr1) ? (expr2) : (expr3)
如果expr1结果为True,则返回expr2的结果。
PHP5.3新增一种书写方式,可以省略中间部分,书写为expr1 ?: expr3
如果expr1结果为True,则返回expr1的结果
//原格式 $expr=$expr1?$expr1:$expr2 //新格式 $expr=$expr1?:$expr2
PHP中原本有一个魔术方法__call(),当代码调用对象的某个不存在的方法时该魔术方法会被自动调用。新增的__callStatic()方法则只用于静态类方法。当尝试调用类中不存在的静态方法时,__callStatic()魔术方法将被自动调用。
<?php class MethodTest { public function __call($name, $arguments) { // 参数 $name 大小写敏感 echo "调用对象方法 '$name' " . implode(' -- ', $arguments). "\n"; } /** PHP 5.3.0 以上版本中本类方法有效 */ public static function __callStatic($name, $arguments) { // 参数 $name 大小写敏感 echo "调用静态方法 '$name' " . implode(' -- ', $arguments). "\n"; } } $obj = new MethodTest; $obj->runTest('通过对象调用'); MethodTest::runTest('静态调用'); // As of PHP 5.3.0
用法和Heredoc类似,但使用单引号。Heredoc则需要通过使用双引号来声明。
Nowdoc中不会做任何变量解析,非常适合于传递一段PHP代码。
<?php // Nowdoc 单引号 PHP 5.3之后支持 $name = 'MyName'; echo <<<'EOT' My name is "$name". EOT; //上面代码输出 My name is "$name". ((其中变量不被解析) // Heredoc不加引号 echo <<<FOOBAR Hello World! FOOBAR; //或者 双引号 PHP 5.3之后支持 echo <<<"FOOBAR" Hello World! FOOBAR;
class Test{ public static function testgo() { echo "gogo!"; } } $class = 'Test'; $action = 'testgo'; $class::$action(); //输出 "gogo!"
$arr = [1,'james', '[email protected]']; $array = [ "foo" => "bar", "bar" => "foo" ];
对函数返回数组的成员快捷访问
//例子1 function myfunc() { return array(1,'james', '[email protected]'); } echo myfunc()[1]; //例子2 $name = explode(",", "Laruence,male")[0]; explode(",", "Laruence,male")[3] = "phper";
Session提供了上传进度支持,通过$_SESSION["upload_progress_name"]就可以获得当前文件上传的进度信息,结合Ajax就能很容易实现上传进度条了。
//这样写:(new Foo)->bar(); class test{ function show(){ return 'test'; } } echo (new test())->show();
<?=$var?>
$func = "funcXXOO"; A::{$func}();
echo json_encode("中文", JSON_UNESCAPED_UNICODE); //"中文"
http://www.laruence.com/2011/10/10/2204.html
可以在输出之前,按照自己想法修改最后的值
默认发送“Content-Type: text/html; charset=utf-8”
你再也不需要在HTML里写meta tag,也无需为UTF-8兼容而传送额外的header了。
htmlspecialchars() 和 htmlentities() 现在可更好地支持亚洲字符。
class bar { function foo(bar $foo) { } //其中函数foo中的参数规定了传入的参数必须为bar类的实例,否则系统会判断出错。同样对于数组来说,也可以进行判断,比如: function foo(array $foo) { } } foo(array(1, 2, 3)); // 正确,因为传入的是数组 foo(123); // 不正确,传入的不是数组
这个是用来统计服务请求时间的,并用ms来表示
echo "脚本执行时间 ", round(microtime(true) - $_SERVER["REQUEST_TIME_FLOAT"], 2), "s";
Traits不能被单独实例化,只能被类所包含,类似引用函数一样
trait SayWorld { public function sayHello() { echo 'World!'; } } class MyHelloWorld{ // 将SayWorld中的成员包含进来 use SayWorld; } $xxoo = new MyHelloWorld(); // sayHello() 函数是来自 SayWorld 构件的$xxoo->sayHello();
$records = array( array('id' => 2135,'name' => 'John'), array('id' => 3245,'name' => 'Smith'), array('id' => 5342,'name' => 'Peter') ); //从结果集中取出 name 列$names = array_column($records, 'name'); print_r($names); //从结果集中总取出 name 列,用相应的 id 作为键值 $names = array_column($records, 'name', 'id'); print_r($names);
function always_false() { return false; } if (empty(always_false())) { echo 'This will be printed.'; }
答案使用使用 default
//有一个这样的函数 function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true) { ... } //只设置后面的参数,让前面的参数保持默认,就是使用 default create_query("deleted=0", "name", default, default, false);
function foo(int $i) { ... } foo(1); // $i = 1 foo(1.0); // $i = 1 foo("1"); // $i = 1 foo("1abc"); // not yet clear, maybe $i = 1 with notice foo(1.5); // not yet clear, maybe $i = 1 with notice foo([]); // error foo("abc"); // error
yield关键字用于当函数需要返回一个迭代器的时候,逐个返回值。
//以前这样做 $firstNames = []; foreach ($users as $user) { $firstNames[] = $user->firstName; } //现在可以这样做 $firstNames = [foreach ($users as $user) yield $user->firstName]; //有一个例子 function number10(){ for($i = 1; $i <= 10; $i += 1) yield $i; } //返回一个数组 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
$array = [ [1, 2], [3, 4], ]; foreach ($array as list($a, $b)) { echo "A: $a; B: $b\n"; }
使用opcache会提高php的性能,你可以和其他扩展一样静态编译(--enable-opcache)或者动态扩展(zend_extension)加入这个优化项。
echo array(1, 2, 3)[0]; echo [1, 2, 3][0]; echo "foobar"[2];
const A = 2; const B = A + 1; class C { const STR = "hello"; const STR2 = self::STR + ", world"; } const ARR = ['a', 'b'];
function test(...$args){ print_r($args); } test(1,2,3); //输出 Array( [0] => 1 [1] => 2 [2] => 3 )
function add($a, $b, $c) { return $a + $b + $c; } $arr = [2, 3]; add(1, ...$arr);
//use 运算符可以在类中导入外部的函数和常量了。 对应的结构为 use function 和 use const。 namespace Name\Space { const FOO = 42; function f() { echo __FUNCTION__."\n"; } } namespace { use const Name\Space\FOO; use function Name\Space\f; echo FOO."\n"; f(); }
加入右连接运算符 ** 来进行幂运算。 同时还支持简写的 **= 运算符,表示进行幂运算并赋值。
printf(2 ** 3); // 8 $a = 2; $a **= 3;printf($a); // 8