php
1. 传值与传引用的区别
-
传值:就是把实参赋值给形参,传递后,两者没有任何关联。所以对形参的修改不会影响到实参
-
传引用:是以地址的方式传递参数,传递后,实参和形参都是同一个对象,只是名字不同,因为他们都指向都一个地址,所以对形参的修改会影响到实参。
注意:php变量时存储于zval容器内的,传值时不会重新分配内存空间,只是refcount加一,只有形参的值改变才会分配新的内存;
传引用时则是is_ref变为1
典型例子:
$a = 1;
$b = $a;
$c = &$a;
$d = $c;
$e = &$c;
$e = 2;
echo $a,"\n",$b,"\n",$c,"\n",$d,"\n",$e,"\n";
//分析得出a,c,e实质上是同一个变量,值=2
b与a独立,值未改变=1
d与c独立,取c的初始值1
最终结果
2
1
2
1
2
特例:对象之间的赋值 浅复制&深复制
$user = new User();
//这种写法,实际上是引用写法,
//也就是说本质上user1和user2变量指//向的都是同一个PHP对象,
//占用的内存也只有一份
$user1 = $user;
//要复制对象,需要使用clone
$user2 clone $user;
//clone 会触发类的魔术方法__clone()
2. echo,print,print_r和var_dump的区别
-
echo 是语言结构。可以一直输出多个值,多个值用逗号分隔。只能输出数字、字符串、布尔值。如果输出数组只会输出一个Array,且会报错
-
print 是语言结构。一次只能输出一个值。其他与echo一样;
-
print_r 是函数。可以把数字、字符串、数组简单的答应出来
-
var_dump 是函数。可以输出php所有的基础数据类型,并且能显示数据的类型、长度和值。
-
var_export 打印出数据的键和值
重点:函数比语言结构多了解析过程,因此语言结构比函数快!
常见语言结构有:
echo();print();
isset();unset();
exit();die();
list();
include();require();
3. include与require的区别,require和require_once哪个效率更高?
- require:
- 遇到错误,报fatal error错误,脚本停止执行。
- 无条件执行,引入后php会将文件重新编译,让引入文件成为原文件的一部分。一般放在程序头
- 没有返回值
//例子:
if(false) {
require "a.php";//还是会执行
}
- include:
- 遇到错误,报warning error,脚本继续执行。
- 有条件执行,一般放在流程控制语句内
- 有返回值
4. 常见魔术方法
__construct() 构造函数 创建对象时调用
__destruct() 析构函数 销毁对象时调用
__toString() 对象被当做字符串时,自动调用
__invoke() 当尝试以调用函数的方式调用一个对象时,自动调用
__clone() 对象被clone时调用
__call() 调用对象不存在的方法是调用
__callStatis() 调用类不存在的静态方法是调用
例如:在laravel框架调用一个controller中不存在的action。可以在controller中实现一个__invoke()方法,这个方法会被触发
5. 如何理解命名空间
1.防止类名和函数方法冲突
2.防止编写的代码与php内部的类、函数、常量或与第三方的类、函数、常量之间名字冲突
3.为很长的标识符建一个别民,提高代码可读性
PHP5.3.0之后的版本开始支持命名空间
6. 递归多级目录
//点三个参数表示,递归创建
mkdir($path, 0777, true);
7.获取毫秒级时间戳
$time_float = microtime(true);//单位秒
echo bcmul($time_float,1000); //单位毫秒