命名空间,闭包与匿名函数,生成器

命名空间

命名空间在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);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值