Fork me on GitHub

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延迟绑定类名,指代创建对象时所使用的类

参考资料

posted @ 2019-04-14 22:02  huan&ping  阅读(277)  评论(0编辑  收藏  举报