PHP最新面试题2019
副标题[/!--empirenews.page--]
? 1、字符串"0"在PHP和js中转换为布尔值是false还是truephp:false;? php 弱语言?'0'和0一样; js:true;字符串除了空字符串('')其他都是true(包括' '这种中间有空格的); 2、echo, print,print_r,var_dump 区别echo 语言结构,并不是真正的函数,可以一次输出多个值,多个值之间用逗号分隔。 print 是函数,只能输出一个值。 print_r 能打印数组,对象。 var_dump 能打印数组,对象,并且带数据类型。 3、程序 $a = "www"; settype($a,'array'); (string)$a; floatval($a); echo gettype($a); 运行后输出结果:array? 原因:settype会改变原值的数据类型,string,floatval属于强制转换,不改变原值的数据类型。 4、用PHP实现冒泡排序算法。// 控制轮次数 for ($i = 1; $i < count($arr); $i++) { 控制次数,并判断大小交换位置 $j = 0; $j < $arr) - $i; $j++) { 如果当前值大于后面的值 if ($arr[$j] > $j + 1]) { 交换 $temp = $j]; $j] = $j + 1] = $temp; } } } 5、一 群猴子排成一圈,按1,2,…,n依次编号。然后从第1只开始数,数到第m只,把它踢出圈,从它后面再开始数,再数到第m只,在把它踢出去…,如此不停的 进行下去,直到最后只剩下一只猴子为止,那只猴子就叫做大王。要求编程模拟此过程,输入m、n,输出最后那个大王的编号。$n猴子个数 $m第几个位置 function fn($n,$m) { 将猴子数量放到数组内 $i < $n + 1; ) { $arr[] = $i; } $i = 0; 当数组内只剩下一个值跳出数组 while ($arr) > 1遍历数组,判断当前猴子是否为出局序号,如果是则出局,否则放到数组最后 if (($i + 1) % $m == 0) { 当循环次数满足m值 去除掉当前值 unset(]); } else { 不满足循环次数 放到数组对尾 array_push($arr,1)">]); 删除掉当前循环内容 ]); } ; } return $arr; } 调用 var_dump(fn(15,7)); 6、分表,分区,分库,难点是什么?怎么均匀存储数据?分表:即把一个很大的表的数据分到几个表中。 分表又分为垂直拆分和水平拆分。 垂直拆分:把字段拆分;可以把不常用的字段放一张表,把大字段放一张表,把常用的字段放一张表。 水平拆分:把表数据拆分;可以通过id取模的方式拆分数据,比如要拆分成100张表,user0,user1,user2......,id%100得到的余数即存储到哪张表。 分表难点:按什么策略来分表;分表后该怎么查询数据(什么情况下该访问哪张表)。 ? 分区:所有的数据还在一个表中,但物理存储数据根据一定的规则存放在不同的文件中,文件也可以放到不同的磁盘上。分区的类型:range分区,list分区,hash分区和key分区。 常见分区方式: 1、根据时间间隔分区,比如以年为单位,分区存储数据。 2、根据自增的主键id,hash(id div 10000000) 表示100万数据建立一个分区。 ? 分库:把数据分几个库存储。分为垂直分库和水平分库。 垂直分库:根据表来分数据库,同一类型的表一个数据库;比如博客一个数据库,论坛一个数据库。 水平分库:根据某些规则,将同一个表的数据分布在不同的库上;比如根据用户id把用户的博客文章分布在5个数据库上。 7、PHP中单引号和双引号的区别。在一般情况下,单引号和双引号是可以互通的,但双引号内部变量会解析,而单引号内部变量不解析。 8、require()和include()的区别。都是引入别的页面; require()出现错误,会终止程序;而include()则会继续执行,并会显示一个错误警告; 在实际项目中,一般使用require_one()更好。 9、PHP中超全局变量,魔术变量,魔术方法:超全局变量(9个): 参考:https://www.php.net/manual/zh/language.variables.superglobals.php $GLOBALS $_SERVER $_REQUEST $_POST $_GET $_FILES $_ENV $_COOKIE $_SESSION 魔术变量(8个): __LINE__? ??文件中的当前行号。 __FILE__? ??文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。 __DIR__? ? ?文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。 __FUNCTION__? ? 返回该函数被定义时的名字(区分大小写) __CLASS__? ? 返回该类被定义时的名字(区分大小写)。 __TRAIT__? ? Trait 的名字(PHP 5.4.0 新加)。自 PHP 5.4.0 起,PHP 实现了代码复用的一个方法,称为 traits。 __METHOD__? ? ?返回该方法被定义时的名字(区分大小写)。 __NAMESPACE__? ? 当前命名空间的名称(区分大小写)。 魔术方法: 参考:https://www.php.net/manual/zh/language.oop5.magic.php 10、栈和队列栈:是允许在同一端进行插入和删除的特殊线性表。 栈也称为先进后出表。 注:线性表是最基本,最简单,也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系。 队列:是一种特殊的线性表。特殊之处在于只允许在前端进行删除操作,在表的后端进行插入操作。 队列也称为先进先出表。 11、对称加密和非对称加密对称加密指的就是加密和解密使用同一个秘钥,所以叫做对称加密。对称加密只有一个秘钥,作为私钥。? 常见的对称加密算法:DES,AES,3DES等等。 非对称加密指的是:加密和解密使用不同的秘钥,一把作为公开的公钥,另一把作为私钥。公钥加密的信息,只有私钥才能解密。私钥加密的信息,只有公钥才能解密。? 常见的非对称加密算法:RSA,ECC(移动设备用),DSA(数字签名用) 12、时间复杂度和空间复杂度算法复杂度分为时间复杂度和空间复杂度。 其作用:时间复杂度是指执行算法所需要的计算工作量;而空间复杂度是指执行这个算法所需要的内存空间。 13、抽象类和接口的区别参考:https://blog.csdn.net/sunlylorn/article/details/6124319 14、PHP创建多级目录function makedir($pathif (is_dir()){ echo "目录已存在"; } { $res = mkdir($path,0777,true); $resecho "创建成功"; } echo "创建失败"; } } } 15、PHP写一段代码,确保多个进程同时写入一个文件成功function writeData($filepath,1)">$data) { $fp = fopen(以追加的方式打开文件,返回的是指针 do { usleep(100); 暂停执行程序,参数是以微秒为单位的 } while (!flock($fp,LOCK_EX)); LOCK_EX 取得独占锁定(写入的程序)进行排它型锁定 获取锁 有锁就写入,没锁就得 fwrite($data . "n"); 以追加的方式写入数据到打开的文件 LOCK_UN 释放锁定(无论共享或独占)。 fclose($fp); 关闭打开的文件指针 ; } 16、PHP的is_writeable()函数存在Bug,无法准确判断一个目录/文件是否可写,请写一个函数来判断目录/文件是否绝对可写。下面是CodeIgniter 中的is_really_writable函数解决方案,详见函数注释 其中bug存在两个方面, 1、在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。 如果是目录,在目录中新建文件并通过打开文件来判断; 如果是文件,可以通过打开文件(fopen),来测试文件是否可写。 2、在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。 读取配置文件是否safe_mode是否开启。 /** * Tests for file writability * * is_writable() returns TRUE on Windows servers when you really can't write to * the file,based on the read-only attribute. is_writable() is also unreliable * on Unix servers if safe_mode is on. * * @access private * @return void */ if ( ! function_exists('is_really_writable')) { function is_really_writable($file) { If we're on a Unix server with safe_mode off we call is_writable if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSEreturn is_writable(); } For windows servers and safe_mode "on" installations we'll actually // write a file then read it. Bah... )) { $file = rtrim($file,'/') . '/' . md5(mt_rand(1,100) . )); $fp = @) { ; } $fp); @chmod( DIR_WRITE_MODE); @unlink(); TRUEelseif (!is_file($file) OR (; } ; } } 17、php中去除一个字符串中非字母部分preg_replace('/[^a-z]/i','',1)">$str); 18、将一个字符串去除字符串中非字母部分,并将字符串中’_‘号后面首字母和字符串首字母大写,如a2b_ab23c得到AbAbc。function getStr($str [^a-z]用来匹配任何不在a和z之间的字符,i表示不区分大小写。 $str = preg_replace('/[^a-z_]/i',1)">); $arr = explode('_',1)">); foreach($arr as $key=>$value){ ucfirst()首字母大写 $key] = ucfirst(); } implode('',1)">echo ; } getStr('a2b_ab23c'); 19、使用js实现进入一个页面10s后弹出提示框,提示框内容为‘hello world’。setTimeout("alert('hello world')",10000) 20、写一个sql语句查询表A中user_name字段重复出现两次以上的所有数据。SELECT user_name,COUNT(user_name) AS num FROM A GROUP BY user_name HAVING num >=2; (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |