真的变懒了,月更难保。最近在面试别人的过程中,问了一些关于PHP参考资料的知识,发现很多同学对这方面知之甚少,还有很多工作基本没用过。我什至被告知要少用引号,这会导致奇怪的问题。我在心里默默的说,要避免出现奇怪的问题,就是要看懂引用,而不是少用引用。今天就一起分析分析吧。场景假设从提到一个所谓的怪异问题开始。假设我们有这样一个场景:我们从数据库中读取了一组订单数据,我们需要对每条订单数据分别进行处理。$list=[['orderid'=>'123','total_fee'=>10,'name'=>'zhangsan'],['orderid'=>'456','total_fee'=>17,'name'=>'lisi'],['orderid'=>'789','total_fee'=>14,'name'=>'wangwu'],];foreach($listas&$item){//true订单做了什么?}//加上一些其他操作$result=[];//需要返回的结果foreach($listas$item){//重新映射名称$result[]=['order_id'=>$item['orderid'],'amount'=>$item['total_fee'],];}上面的程序会输出如下结果:var_dump($result);array(3){[0]=>array(2){["order_id"]=>string(3)"123"["total_fee"]=>int(10)}[1]=>array(2){["order_id"]=>string(3)"456"["total_fee"]=>int(17)}[2]=>array(2){["order_id"]=>string(3)"456"["total_fee"]=>int(17)}}这就是经常遇到的所谓怪问题。首先用引用循环处理数据,然后使用与引用相同的临时变量继续处理数据。这是:$item。很多同学说要防止出现这种问题,要少用引用。这种态度太消极了。引用在很多地方使代码编写变得简单,对大型数组使用引用可以节省大量内存。怪异问题分析下面我们来分析一下出现上述问题的原因。我们先看看引用的定义。引用是指以不同的名称访问相同的变量内容。然后在这部分代码中foreach($listas&$item){//order怎么办}$item最后指向了和$list[2]一样的变量内容。并且foreach循环结束后,$item并没有被销毁,所以以后如果有同名的,会继续生效。示意图如下:然后在接下来的另一个循环中。foreach($listas$item){//重映射名称$result[]=['order_id'=>$item['orderid'],'amount'=>$item['total_fee'],];}perWhen$list将变量赋值给$item,同时改变$list[2]的值。因此出现了上面的奇怪情况。我一步一步给你看:第一次循环$list[0],$item指向orderid=123的订单,因为$item是对$list[2]的引用,$orders[2]也指向到orderid=123的订单;第二个循环$list[1],$item指向orderid=456的订单,所以$list[2]也指向orderid=456;第三个循环$list[2],显然它的值变成了一个orderid=456的订单。通过上面的分析,相信大家对所谓的引用怪异都有了一个了解。那么如何避免这种情况呢?其实很简单。记得每次使用后取消设置引用。您可以毫无顾虑地继续使用它。具体到这个例子:foreach($listas&$item){//订单做什么}unset($item);//和一些其他操作foreach($listas$item){//重映射名称}引用的妙用前面说过,引用可以写出简洁的代码。无限分类器的使用是一种使用场景。比如我们有分类数据:$catList=['1'=>['id'=>1,'name'=>'color','parent_id'=>0],'2'=>['id'=>2,'name'=>'spec','parent_id'=>0],'3'=>['id'=>3,'name'=>'white','parent_id'=>1],'4'=>['id'=>4,'name'=>'black','parent_id'=>1],'5'=>['id'=>5,'name'=>'large','parent_id'=>2],'6'=>['id'=>6,'name'=>'small','parent_id'=>2],'7'=>['id'=>7,'名字'=>'黄色','parent_id'=>1],];如果我想获得以下形式$result=[['id'=>1,'name'=>'color','children'=>[['id'=>3,'name'=>'white'],['id'=>4,'name'=>'black'],['id'=>7,'name'=>'yellow']]],['id'=>2,'name'=>'specification','children'=>[['id'=>5,'name'=>'big'],['id'=>6,'name'=>'small']]]];如果使用引用,可以非常简单地得到结果。$treeData=[];//保存结果foreach($catListas$item){if(isset($catList[$item['parent_id']])&&!empty($catList[$item['parent_id']])){//绝对是子类别$catList[$item['parent_id']]['children'][]=&$catList[$item['id']];}else{//绝对是一级分类$treeData[]=&$catList[$item['id']];}}你可以尝试实现无引用的无限关卡,对比代码。现在是年底了。没钱发红包给大家,给大家推荐上海一家不错的公司。帮助大家找到新工作。公司网站:https://www.yimishiji.com/手机网站:https://m.yimishiji.com/公司现招聘高级PHP工程师,要求:2-5年PHP开发经验;学士文凭;至少熟悉Laravel和Yii2框架之一;有电商、生鲜相关经验者优先;博客和GitHub是一个奖励。优厚待遇:五险一金;每日应用内购买零农药残留、有机成分和水果;工资15k-30k。公司使用PHP7语法,对新技术保持激进的态度。对于在上海的朋友或者想去上海的朋友,强烈推荐参观。公司地址:上海市长宁区天山西路789号中山国际广场B座一米市场CTO。邮箱:alex.chang@yimishiji.com
