php面试题总结
- 使用awk统计目录数量:
[root@wadeyu nginx-1.15.11]# ll | awk -F ' ' 'BEGIN {cnt=0} {print $0; if(index($1, "d")==1){cnt++;}} END {print "cnt:", cnt;}'
- echo, print, print_r, var_dump, var_export区别
- echo: 语言结构,输出一个或多个字符串,没有返回值
- print: 语言结构,只支持一个参数,有返回值且为1
- print_r: 函数,以易于理解(人类易读)的格式打印/返回变量内容
- var_dump: 函数,打印变量的相关信息,包括类型和值
- var_export: 函数,输出/返回变量合法的php代码字符串
- include, require, include_once, require_once区别
- include:
- 1.语言结构,包含并运行指定文件,文件不存在时,发出E_WARNING级别的警告错误,脚本会继续执行;
- 2.失败时返回false,成功时,若脚本中未显示指定返回值则返回true;
- 3.被包含文件的作用域范围跟include语句所在的行作用域一样,函数和类是全局作用域;
- 4.相对路径搜索规则:step1: include_path指定的路径下寻找; step2: 调用脚本文件所在的目录寻找; step3: 执行程序当前的工作目录寻找;
- 5.非php指令()包含的内容,会当做普通文本输出;
- require: 几乎跟include一样,被包含的文件不存在时,会报E_COMPILE_ERROR级别的错误,会中断脚本执行
- include_once: 跟include语句类似,只会包含一次文件,对已包含的文件不会再次包含,若被包含的文件有返回值,第一次包含会得到返回值,第二次包含会返回true
- require_once:跟require语句类似,同一个文件多次包含,只会包含一次,若有返回值,第一次包含会正常返回,后面包含返回true
- 类自动加载机制
- 1.实现__autoload函数,自定义加载类,参数是类名,php>=7.2不建议使用
- 2.使用spl_autoload_register函数注册任意数量的类的自动加载器,该函数会把注册的自动加载器加入到__autoload函数队列中,按定义时的顺序逐个执行
- 斐波那契数列递归优化
- 优化前的版本
- 参数很大时,会有栈溢出的风险
function fib(int $n){
if ($n < 3){
return 1;
}
return fib($n-1) + fib($n-2);
}
- 优化后的版本
- 使用尾递归
function fibVer2(int $start, int $n, int $prev1 = 1, int $prev2 = 1){
if ($n < 3){
return 1;
}
if ($start >= $n - 2){
return $prev1 + $prev2;
}
return fibVer2($start+1, $n, $prev2, $prev1 + $prev2);
}
- 模拟摇色子,根据设置的概率返回对应的点数,比如1,2,3,4,5概率是10%,6点的概率是百分之50
- 根据数字范围区间近似计算概率
function getBetNum(array $aBetRate = array()){
$total = array_sum($aBetRate);
$rand = mt_rand(0, $total);
$range = 0;
foreach($aBetRate as $num => $rate){
$range += $rate;
if($rand <= $range){
return $num;
}
}
return -1;
}
- 判断是否合法的电话号码
function isValidPhone($phone){
return preg_match('/(^\d{3,4}\s*\-\s*\d{8}$)|(^1\d{10}$)/', $phone) === 1;
}
// 测试用例
$aPhone = ['0791-12341234', '0791 - 12341234', '010-81234123', '010 - 81234123', '123-a1133333', '15817423635', '23423423412', '1567894'];
foreach($aPhone as $phone){
echo $phone, ',result:', (isValidPhone($phone) ? 'valid' : 'invalid'), "\n";
}
- 类中有哪些魔术方法以及用途
- __construct([mixed $args[,...]]):void 构造函数,每次创建新对象时调用的方法,非常适合使用对象之前做一些初始化工作
- __destruct(void):void 析构函数,对象被销毁时执行
- __set(string $name, mixed $value):void 对对象不存在属性赋值时被调用
- __get(string $name):mixed 访问对象不存在属性时被调用
- __isset(string $name):bool 对对象不存在属性使用isset或者empty判断时被调用
- __unset(string $name):void 对对象不存在熟悉使用unset时被调用
- __call(string $name, array $arguments):mixed 调用对象中不存在的方法是被调用
- static __callStatic(string $name, array $arguments):mixed 在静态上下文中调用一个不可访问方法时被调用
- __sleep(void):array 使用serialize函数序列化对象之前被调用,可以用于清理对象,并返回一个对象中应被序列化的变量名称的数组。
- __wakeup(void):void 使用unserialize函数反序列化时,首先会检查是否存在__wakeup魔术方法,如果存在则被调用,用于预先准备对象需要的资源
- __toString ( void ):string 一个对象被当做字符串时,该怎么处理,必须返回字符串
- __invoke ([ $... ] ):mixed 对象当做函数来使用时被调用
- static __set_state ( array $properties ):object 使用var_export导出对象时,静态方法被调用,参数是对象属性列表
- __debugInfo ( void ):array 使用var_dump函数打印对象之前被调用,返回的内容就是var_dump打印的内容
- 设置cookie一小时过期使用time()+3600还是gmtime()+3600?
- 可以设置cookie的函数: setcookie 内容会urlencode,setrawcookie 发生原始内容,不会被urlencode
- 过期时间需要传unix时间戳,所以应使用跟时区无关的函数time()+3600
- gmtime函数:内置扩展中不包括此函数 😦
- foreach遍历数组引用的相关问题
$a = [1,2,3,4];
foreach($a as $k => &$v){
echo "{$k} => {$v}\n";
}
echo "###############\n";
foreach($a as $k => $v){
echo "{$k} => {$v}\n";
}
echo "###############\n";
$a = [1,2,3,4];
foreach($a as $k => &$v){
echo "{$k} => {$v}\n";
}
echo "###############\n";
foreach($a as $k => &$v){
echo "{$k} => {$v}\n";
}
[root@localhost small-fabric-end]# php aaa.php
0 => 1
1 => 2
2 => 3
3 => 4
###############
0 => 1
1 => 2
2 => 3
3 => 3
###############
0 => 1
1 => 2
2 => 3
3 => 4
###############
0 => 1
1 => 2
2 => 3
3 => 4
- 面向对象:通过self, parent, static访问类变量或者方法的区别
- self指代当前访问类
- parent指代当前访问类的父类
- static延迟绑定类名,指代创建对象时所使用的类
- php怎么判断对象是否是空对象
- 方法1:使用内置函数 get_object_vars
- 方法2:使用内置函数 get_class_vars和get_class
- 方法3:使用内置反射类 ReflectionClass
参考资料
作者:WadeYu
出处:http://www.cnblogs.com/wadeyu/
本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/wadeyu/
本文版权归本人和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。