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指令(<?php xxx; ?>)包含的内容,会当作普通文本输出;
  • 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函数:内置扩展中不包括此函数 :(

参考资料

相关文章
相关标签/搜索