PHP中数组插入数据通常有这么几种:
- 定义的时候直接赋值
1 | $arr = array(‘apple’, ’banana’); |
- 使用数组变量操作
1 | $arr = array(); |
- 使用array_push()插入
1 | $arr = array(‘apple’); |
在项目中,我们大部分情况都是先从数据库中获取数据,然后转成数组形式,而对于第一种情况,在定义数组的时候直接赋值往往只适合数据量很小,而且是已知的情况,所以就不存在什么代码优化了,我们主要讲第二种和第三种。
PHP中数组插入数据通常有这么几种:
1 | $arr = array(‘apple’, ’banana’); |
1 | $arr = array(); |
1 | $arr = array(‘apple’); |
在项目中,我们大部分情况都是先从数据库中获取数据,然后转成数组形式,而对于第一种情况,在定义数组的时候直接赋值往往只适合数据量很小,而且是已知的情况,所以就不存在什么代码优化了,我们主要讲第二种和第三种。
1
PHP读取excel、csv文件的库有很多,但用的比较多的有: PHPOffice/PHPExcel、PHPOffice/PhpSpreadsheet,现在PHPExcel已经不再维护了,最新的一次提交还是在2017年12月25号,建议直接使用PhpSpreadsheet,而且这两个项目都是同一个组织维护的,本文介绍PhpSpreadsheet的使用。
PhpSpreadsheet这个库是纯PHP写的,提供了非常丰富的类和方法,而且支持很多文件格式:
426
php_zip
扩展php_xml
扩展php_gd2
扩展PHP中,=
的作用都是将一个值复制给另一个(大多数编程语言都是一样),将=
作用在基本数据类型上时,就直接进行了赋值,并且变量的修改互不影响,如下:
1 | $a = 1; |
而在复制对象时,=
只是简单地将两个变量指向同一个类实例,测试一下:
1 | class Student |
从上面的代码中,就能明显看出$student1
和$student2
两个变量指向的是同一个对象,新手看到这可能并没有发现其中蹊跷,而且等值检测也没有问题啊(其实这里的等值检测是看不出什么的),这时,如果我继续修改$student2
中的属性时,就能发现问题:
1 | $student2->name = 'Jack'; |
为什么会这样呢,我只是想修改$student2
的属性,为什么$student1
也改了,这就好比Dota里面的地卜师,只要逮到你一个分身,你就挂了。
4978
其实,看到这种情况,大概就能猜到PHP中对象的赋值都是通过引用操作,$student1
和$student2
没有各自保留一份单独的副本,在内存中的分配大概就是这样的:
5141
两个变量指向的是同一个内存地址,所以我们改变其中一个变量的属性是另一个也会变,但如果我们想要对两个变量做不同的操作并且互不影响该怎么办?
好在PHP提供了一个clone
关键字来达到这个目的。
1 | $student1 = new Student('mike', 19); |
通过clone
复制后,现在$student1
和$student2
就是两个不同的变量,修改互不影响。
现在有这么一种情况,在复制对象时,想做一些修改操作,实际开发中,$id
属性可能会与数据库表中某条记录一一对应,在复制之后,两个对象就指向数据库中的同一条记录了,那么使用__clone()
就能控制复制时,哪些属性可以复制,哪些应该不复制或者置空。__clone()
是个魔术方法,在对象上调用clone
关键字时会自动调用。如下代码所示:
1 | class Student |
当在$student1
上调用clone
时,产生一个新的副本给$student2
,这时$student2
上就会自动调用__clone
方法,使$id
为0。
上面通过clone
和__clone()
可以保证所有的基础数据类型可以被完全复制,但如果复制的对象中的属性也是一个对象时,复制后的两个对象都会引用同一个属性,修改时会互相影响,如下:
1 | Class Score { |
上面这种情况并不是我们希望看到的,我们不想对象属性复制后被共享。解决方法就是在__clone()
做做一些修改:
1 | function __clone() { |
我所了解的PHP中对象复制大概就是这样,类似__clone()
这样的魔术方法还有好几个,常见的还有:__set()
、__unset()
、__call()
等,利用这些魔术方法可以实现更多复杂的操作,以后慢慢学习。
欢迎阅读本篇文章,如有兴趣可以关注博主公众号哦:
Mac上更新PHP 7.2后,再次使用Valet
时提示无法定位到PHP,如下所示:
46
一条命令解决:
1 | ln -s /usr/local/opt/[email protected]/bin/php /usr/local/bin/php |