标签:php高级 php面试题
写出能够创建多级目录的PHP函数(新浪网技术部)
<?php
//**
*创建多级目录
*@parem $path string 要创建的目录
*@parem $mode int 创建目录的模式,在windows下可以忽略
*/
function create_dir($parem,$mode = 07777){
if(is_dir($path)){
#如果目录已经存在,则不创建
echo "该目录已经存在";
}else{
#不存在,创建
if(mkdir($path,$mode,true)){
echo "创建目录成功";
}else{
echo "创建目录失败";
}
}
}
?>
2.写出smarty模板的特点(新浪网技术部)
速度快、编译快、缓存技术、插件机制、强大的表现逻辑
3.抓取远程图片到本地,你会用什么函数?
file_get_contents()或者curl()
4.php垃圾收集机制是怎么样的?
(1)PHP可以进行内存管理,清除不再需要的对象。
(2)PHP使用了引用计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。
(3)每个对象都内含一个引用计数器,每个reference连接到对象,计数器加1。
(4)当reference离开生成空间或者设置为null,计数器减1。
(5)当某个对象的引用计数器为0时,PHP知道你不在需要使用这个对象,释放其所在空间。
5.请写一段PHP代码,确保多个进程同时写入文件成功(腾讯)
核心思路:加锁
<?php
$fp = fopen("lock.txt","w+");
if(flock($fp,LOCK_EX)){
获得写锁,写数据
fwrite($fp,"write something");
解锁
flock($fp,LOCK_UN);
}else{
echo "file is locking";
}
fclose($fp);
?>
<?php // 方案一 function getExt1($url){ $arr = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.php [query] => id=1 ) $file = basename($arr[‘path‘]); $ext = explode(‘.‘, $file); return $ext[count($ext)-1]; } // 方案二 function getExt2($url){ $url = basename($url); $pos1 = strpos($url,‘.‘); $pos2 = strpos($url,‘?‘); if (strstr($url,‘?‘)) { return substr($url,$pos1+1,$pos2-$pos1-1); } else { return substr($url,$pos1); } } $path = "http://www.sina.com.cn/abc/de/fg.php?id=1"; echo getExt1($path); echo "<br />"; echo getExt2($path);?>
<?php function my_scandir($dir){ $files = array(); if(is_dir($dir)){ if ($handle = opendir($dir)) { while (($flie = readdir($handle))!== false) { if ($flie!="." && $file!="..") { if (is_dir($dir."/".$file)) { $files[$file] = my_scandir($dir."/".$file); } else { $files[] = $dir."/".$file; } } } closedir($handle); return $files; } } }?>
创建类别表如下:
CREATE TABLE category( cat_id smallint unsigned not null auto_increment primary key comment‘类别ID‘, cat_name VARCHAR(30)NOT NULL DEFAULT‘‘COMMENT‘类别名称‘, parent_id SMALLINT UNSIGNED NOT NULL DEFAULT 0 COMMENT‘类别父ID‘)engine=MyISAM charset=utf8;
编写一个函数,递归遍历,实现无限分类
<?php function tree($arr,$pid=0,$level=0){ static $list = array(); foreach ($arr as $v) { //如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点 if ($v[‘parent_id‘] == $pid) { $v[‘level‘] = $level; $list[] = $v; tree($arr,$v[‘cat_id‘],$level+1); } } return $list; }?>
<?php function releative_path($path1,$path2){ $arr1 = explode("/",dirname($path1)); $arr2 = explode("/",dirname($path2)); for ($i=0,$len = count($arr2); $i < $len; $i++) { if ($arr1[$i]!=$arr2[$i]) { break; } } // 不在同一个根目录下 if ($i==1) { $return_path = array(); } // 在同一个根目录下 if ($i != 1 && $i < $len) { $return_path = array_fill(0, $len - $i,".."); } // 在同一个目录下 if ($i == $len) { $return_path = array(‘./‘); } $return_path = array_merge($return_path,array_slice($arr1,$i)); return implode(‘/‘,$return_path); } $a = ‘/a/b/c/d/e.php‘; $b = ‘/a/b/12/34/c.php‘; $c = ‘/e/b/c/d/f.php‘; $d = ‘/a/b/c/d/g.php‘; echo releative_path($a,$b);//结果是../../c/d echo "<br />"; echo releative_path($a,$c);//结果是a/b/c/d echo "<br />"; echo releative_path($a,$d);//结果是./ echo "<br />";?>
mysql_fetch_row()把数据库的一列储存在一个以零为基数的数组中,第一栏在数组的索引0,第二栏在索引1,依此类推。
mysql_fetch_assoc()把数据库的一列储存在一个关联数组中,数组的索引就是字段名称,例如我的数据库查询送回“first_name”、“last_name”、“email”三个字段,数组的索引便是“first_name”、“last_name”和“email”。
mysql_fetch_array()可以同时送回mysql_fetch_row()和mysql_fetch_assoc()的值。
方法1(对于PHP5及更高版本):
$readcontents=fopen("http://www.phpres.com/index.html","rb");$contents=stream_get_contents($readcontents); fclose($readcontents);echo $contents;
方法2:
echo file_get_contents("http://www.phpres.com/index.html");
由模型(model),视图(view),控制器(controller)完成的应用程序。
model层负责提供数据,和数据库有关的操作都交给模型层来处理,view层则提供交互的界面,并输出数据,而controller层则负责接收请求,并分发给相应的model来处理,然后调用view层来显示。
GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。自从PHP 4.3.0版本后GD便内建在PHP系统中。
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()这不是一个PHP函数,会引致执行错误。
file_open()这不是一个PHP函数,会引致执行错误。
fopen()这是正确答案,fopen()可以用来开启档案以便读写。
open_file()这不是一个PHP函数,会引致执行错误。
smarty是一个模板引擎,使用smarty主要是为了实现逻辑和外在内容的分离,如果不使用模板的话,通常的做法就是php代码和html代码混编。使用了模板之后,则可以将业务逻辑都放到php文件中,而负责显示内容的模板则放到html文件中。
Smarty在执行display方法的时候,读取模板文件,并进行数据替换,生成编译文件,之后每次访问都会直接访问编译文件,读取编译文件省去了读取模板文件,和字符串替换的时间,所以可以更快,编译文件里时间戳记录模板文件修改时间,如果模板被修改过就可以检测到,然后重新编译(编译是把静态内容保存起来,动态内容根据传入的参数不同而不同)。
如果启用了缓存,则会根据编译文件生成缓存文件,在访问的时候如果有缓存文件并且缓存文件没有过期,则直接访问缓存文件。
smarty,phplib等
Smarty
方法一:php函数跳转,缺点,header头之前不能有输出,跳转后的程序继续执行,可用exit中断执行后面的程序。header("Location:网址");//直接跳转
header("refresh:3;url=http://axgle.za.net");//三秒后跳转
方法二:利用metaecho"<meta http-equiv=refresh content=‘0;url=网址‘>";
可以
SVN或者CVS
TortoiseSVN-1.2.6
过滤javascript脚本参考:
<?php header("content-type:text/html;charset=utf-8"); $script = "以下内容不显示:<script type=‘text/javascript‘>alert(‘cc‘);</script>"; $pattern = ‘/<script[^>]*?>.*?</script>/si‘; echo preg_replace($pattern, "脚本内容", $script);//以下内容不显示:脚本内容?>
方案一,使用PHP内建函数strip_tags()除去HTML标签
方案二,自定义函数,如下:
<?php header("content-type:text/html;charset=utf-8"); function strip_html_tags($str){ $pattern = ‘/<("[^"]*"|\‘[^\‘]\*\‘|[^>"\‘])*>/‘; return preg_replace($pattern,‘‘,$str); } // 实例 $html = ‘<p id="">ddddd<br /></p>‘; echo strip_html_tags($html); echo "<br />"; $html = ‘<p id=">">bb<br />aaa<br /></p>‘; echo strip_html_tags($html);?>
preg_match(‘/^[\w\-\.]+@[\w\-]+(\.\w+)+$/‘,$email);
主要区别有以下三种:
preg_replace()里面的正则可以写成型如:"/.xxx/"而ereg_replace()里面的正则需写成型如 "xxx"
preg_replace()能操作数组,而ereg_replace()不可以
在逆向引用用preg_replace()可使用0-99个,而ereg_replace()最多为9个
使用Perl兼容正则表达式语法的preg_match()函数通常是比ereg()更快的替代方案。
首先进入php安装目录
php -f d:/wamp/www/1.php 其中-f参数指定要执行的php文件
php -r phpinfo(); 其中-r表示直接执行php代码,无需写开始结束标记
编写如下函数:
<?php header("content-type:text/html;charset=utf-8"); function getAttrValue($str,$tagName,$attrName){ $pattern1="/<".$tagName."(\\s+\\w+\s*=\\s*([\\‘\\\"]?)([^\\‘\\\"]*)(\\2))*\\s+".$attrName."\\s*=\\s*([\\‘\\\"]?)([^\\‘\\\"]*)(\\5)(\\s+\\w+\\s*=\\s*([\\‘\\\"]?)([^\\‘\\\"]*)(\\9))*\\s*>/i"; $arr=array(); $re=preg_match($pattern1,$str,$arr); if($re){ echo"<br/>\$arr[6]={$arr[6]}"; }else{ echo"<br/>没找到。"; } } // 示例 $str1="<test attr=‘ddd‘>"; getAttrValue($str1,"test","attr");//找test标签中attr属性的值,结果为ddd $str2="<test2 attr=‘ddd‘attr2=‘ddd2‘t1=\"t1 value\"t2=‘t2 value‘>"; getAttrValue($str2,"test2","t1");//找test2标签中t1属性的值,结果为t1 value?>
这是把一个日期从MM/DD/YYYY的格式转为DD/MM/YYYY格式。
输出26/08/2003
A.redir()
B.header()
C.location()
D.redirect()
答案:B
redir()这不是一个PHP函数,会引致执行错误。
header()这个是正确答案,header()函数发送头信息,可以用来使浏览器转向到另一个页面,例如:header("Location:http://www.search-this.com/")。
location()这不是一个PHP函数,会引致执行错误。
redirect()这不是一个PHP函数,会引致执行错误。
28.When turned on____________will_________your script with different variables from
HTML forms and cookies.(腾讯)
A.show_errors,enable
B.show_errors,show
C.register_globals,enhance
D.register_globals,inject
答案:C
29.一个函数的参数不能是对变量的引用,除非在php.ini中把____设为on。
allow_call_time_pass_reference
是否启用在函数调用时强制参数被按照引用传递
<META http-equiv=‘Content-Type‘content=‘text/html;charset=gbk‘>
,请使用PHP语言写一个函数,把一个标准HTML页面的类似meta标记中的charset部分值改为big5。(新浪)请注意:
(1)需要处理完整的html页面,即不光此meta语句
(2)忽略大小写
(3)‘和"在此处是可以互换的
(4)‘Content-Type‘两侧的引号是可以忽略的,但‘text/html;charset=gbk‘两侧的不行
(5)注意处理多余空格
编写正则表达式如下:$reg1="/(<meta\\s*http-equiv\\s*=\\s*([‘\"]?)Content-Type(\\2)\\s*content\\s*=\\s*([‘\"])text\/html;charset=)(UTF-8)(\\4)(\\s*\/?>)/i";
<?php function checkDateTime($data){ if (date(‘Y-m-d H:i:s‘,strtotime($data)) == $data) { return true; } else { return false; } } // 示例 $data = ‘2015-06-20 13:35:42‘; var_dump(checkDateTime($data));//bool(true) $data = ‘2015-06-36 13:35:42‘; var_dump(checkDateTime($data));//bool(false)?>
标签:php高级 php面试题
原文地址:http://11221198.blog.51cto.com/11211198/1980970