七道PHP经典面试题(附答案)
本篇文章向大家介绍七道PHP经典面试题(附答案),有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。
1.合并两个数组有几种方式,试比较它们的异同
方式:
1、array_merge()
2、’+’
3、array_merge_recursive
异同:
array_merge 简单的合并数组
array_merge_recursive 合并两个数组,如果数组中有完全一样的数据,将它们递归合并
array_combine 和 ‘+’ :合并两个数组,前者的值作为新数组的键
2.请写一个函数来检查用户提交的数据是否为整数(不区分数据类型,可以为二进制、八进制、十进制、十六进制数字)
答:其实主要还是 is_int 和 floor 这个方法
if(!is_numeric($jp_total)||strpos($jp_total,".")!==false){ echo "不是整数"; }else{ echo "是整数"; }
3.PHP 的 strtolower () 和 strtoupper () 函数在安装非中文系统的服务器下可能会导致将汉字转换为乱码,请写两个替代的函数实现兼容 Unicode 文字的字符串大小写转换
答:原因是:中文是由多字节组成的,而只有英文系统的单个英文字符只有一个字节,所以该系统把中文的每一个字节都做了 strtolower () 处理,改变后的中文字节拼接在一起就成了乱码(新生成的编码映射对应的字符可能就不是中文了)
手动解决:用 str_split (string string,intstring,intsplit_length = 1) 按每个字节切割,像中文能切割成三个字节。对识别到的字节若是英文字母则进行转换。
<?php function mystrtoupper($a){ $b = str_split($a, 1); $r = ''; foreach($b as $v){ $v = ord($v); if($v >= 97 && $v<= 122){ $v -= 32; } $r .= chr($v); } return $r; } $a = 'a中你继续F@#$%^&*(BMDJFDoalsdkfjasl'; echo 'origin string:'.$a." "; echo 'result string:'; $r = mystrtoupper($a); var_dump($r);
4.PHP 的 is_writeable () 函数存在 Bug,无法准确判断一个目录 / 文件是否可写,请写一个函数来判断目录 / 文件是否绝对可写
答:其中 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") == FALSE){ return is_writable($file); } // For windows servers and safe_mode "on" installations we'll actually // write a file then read it. Bah... if (is_dir($file)){ $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100)); if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE){ return FALSE; } fclose($fp); @chmod($file, DIR_WRITE_MODE); @unlink($file); return TRUE; } elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE) { return FALSE; } fclose($fp); return TRUE; } }
5.PHP 的 chmod () 函数存在 Bug,无法保证设置成功,请写一个函数在指定路径下创建一个目录 / 文件并确保可以正确设置权限掩码
答:我也找不到答案
6.PHP 处理上传文件信息数组中的文件类型 $_FILES [‘type’] 由客户端浏览器提供,有可能是黑客伪造的信息,请写一个函数来确保用户上传的图像文件类型真实可靠
答:用 getimagesize 来判断上传图片的类型比 $_FILES 函数的 type 更可靠
同一个文件,使用不同的浏览器 php 返回的 type 类型是不一样的,由浏览器提供 type 类型的话,
就有可能被黑客利用向服务器提交一个伪装撑图片后缀的可执行文件。
可以通过 getimagesize () 函数来判断上传的文件类型,如果是头像文件 会返回这样的一个数组
Array( [0] => 331 [1] => 234 [2] => 3 [3] => width="331" height="234" [bits] => 8 [mime] => image/png );
如果通过 getimagesize () 函数返回的是这样的一个数组 说明上传的是头像文件。其中索引为 2 的表示类型
1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 =JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM,
你可以通过这个再去限制上传的头像类型
<?php $file=$_FILES['file']; if(!empty($file)) { var_dump($file); var_dump(getimagesize($file["tmp_name"])); } ?>
7.PHP 通过对数据的 URL 编码来实现与 Javascript 的数据交互,但是对于部分特殊字符的编解码与 Javascript 的规则不尽相同,请具体说明这种差异,并针对 UTF-8 字符集的数据,写出 PHP 的编解码函数和 Javascript 的编解码函数,确保 PHP 编码数据可以被 Javascript 正确解码 、Javascript 编码的数据可以被 PHP 正确解码
答:
<?php $str = '思源博客siyuantlw/tlw/sy/俺只是一个打酱油的'; $str = iconv("GB2312",'UTF-8',$str); $str = urlencode($str); ?>
//js decodeURIComponent 貌似对 GB2312 编码的格式不识别,必须转为 utf-8 才可以,然后,如果字符串中有空格的 就转为 + 号了
<html> <script> var ds = '<?php echo $str;?>'; var dddd= decodeURIComponent (ds); alert(dddd); </script> </html>