命名空间
命名空间在PHP5.3.0引入。从广义上来说,命名空间是一种封装事物的方法。作用是按照一种虚拟的层次结构组织PHP代码,这种层次类似操作系统中的文件系统的目录结构。
命名空间解决了两类问题:
1、避免用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
定义和使用:
定义使用关键字namespace 一级命名空间名称\二级命名空间名称\...
使用关键字use一级命名空间名称\二级命名空间名称\...
还可以在use 命名空间后加as 给长命名空间命一个简短的别名如 use namespace as othername
上面是一个比较官方的解释,下面我们用大白话和代码解释。
前提:现在有一个项目api_server,下面有repositories(业务处理)、service(基础服务)两个文件夹。我们实现一个从第三方接口获取用户列表的功能。在service文件夹下写一个curl.php,用于发起http请求。repositories文件夹下写一个UsersRepositories.php,调用service/curl.php发起http请求。
service/curl.php代码如下:
<?php
//namespace关键词定义命名空间
namespace App/Service;
Class Curl{
//curl请求
Public function sendRequest(){
}
}
如果我们使用了命名空间,在UsersRepositories.php可以下面这么引用curl.php
Repositories/UsersRepositories.php代码如下:
<?php
//namespace关键词定义命名空间
namespace App/Repositories;
//use 使用命名空间
Use App/Service/Curl;
Public function getUsersList{
$curl_tools = new Curl();
$curl_tools->sendRequest();
}
否则的话我们需要在UsersRepositories.php使用require或include了。
闭包和匿名函数
含义
闭包和匿名函数在PHP5.3.0引入。
闭包指在创建时封装周围状态的函数。即使闭包所在环境不存在,闭包中封装的状 态依然存在。
匿名函数指没有名称的函数。可以赋值给变量,还能像其他任何PHP对象那样传 递。匿名函数仍是函数,可以调用、传参。适合作为函数或者方法的回调。
创建匿名函数
$closure = function ($name){
return sprintf('Hello %s',$name);
}
echo $closure('Josh');输出--> 'Hello Josh'
$plusOne = array_map(function ($number){
return $number+1;
},[1,2,3]);
print_r(plusOne);输出 --> [2,3,4]
创建闭包
function ecclosePerson($name){
return function ($command) use ($name){
return sprintf('%s,$s',$name,$command);
}
}
$clay = ecclosePerson('Clay');
echo $clay('get me sweet tea');输出-->' Clay , get me sweet tea '
具名函数ecclosePerson()有个名为$name的参数,函数返回一个闭包对象,而且闭包封装了$name参数。即便返回的闭包对象跳出ecclosePerson()函数的作用于,它也会记住$name参数值,$name变量仍在闭包中。在下面可以理解为$clay返回的一个闭包,给闭包传参' get me sweet tea ',$command的值即为' get me sweet tea ',$name则为之前传递的参数'Clay'。
生成器
PHP5.5.0引入生成器(generator),生成器是简单的迭代器,会根据需求计算并产出要迭代的值。不要求类实现接口
创建:生成一个范围内的数值
function makeRange($length){
for($i = 0; $i<$length;$i++){
yield $i;
}
}
foreach(makeRange(100000000) as $i){
echo $i;
}
示例:在PHP可用内存只有1GB的情况下处理一个4GB大小CSV文件
function getRows($file){
$handle = fopen($file ,'rb');
if($handle === false){
throw new Exception();
}
while(feof($handle) === false){
yield fgetcsv($handle);
}
fclose($handle);
}
foreach(getRows('data.csv') as $row){
print_r($row);
}