php⾯试题之⼀——PHP核⼼技术(⾼级部分)
⼀、PHP核⼼技术
1.写出⼀个能创建多级⽬录的PHP函数(新浪⽹技术部)
<?php
/**
* 创建多级⽬录
* @param $path string 要创建的⽬录
* @param $mode int 创建⽬录的模式,在windows下可忽略
*/
function create_dir($path,$mode = 0777)
{
if (is_dir($path)) {
# 如果⽬录已经存在,则不创建
echo"该⽬录已经存在";
} else {
# 不存在,创建
if (mkdir($path,$mode,true)) {
echo"创建⽬录成功";
} else {
echo"创建⽬录失败";
}
}
}
>
2.写出smarty模板的特点(新浪⽹技术部)
速度快,编译型,缓存技术,插件机制,强⼤的表现逻辑
3.打开php.ini中的safe_mode,会影响哪些函数?⾄少说出6个。(新浪)
safe_mode,php安全模式,它提供⼀个基本安全的共享环境,在⼀个有多个⽤户账户存在的php开发的web服务器上。当安全模式打开的时候,⼀些函数将被完全的禁⽌,⽽另⼀些函数的功能将会受到限制,如:
chdir,move_uploaded_file,chgrp,parse_ini_file,chown,rmdir,copy,rename,fopen,require,mkdir,unlink等。
注意,在php5.3以上版本,safe_mode被弃⽤,在php5.4以上版本,则将此特性完全去除了。
4.抓取远程图⽚到本地,你会⽤什么函数?(51笔试题)
file_get_contents或者curl
5.PHP的垃圾收集机制是怎样的(腾讯)
PHP可以⾃动进⾏内存管理,清除不再需要的对象。
PHP使⽤了引⽤计数(reference counting)这种单纯的垃圾回收(garbage collection)机制。每个对象都内含⼀个引⽤计数器,每个reference连接到对象,计数器加1。当reference离开⽣存空间或被设为NULL,计数器减1。当某个对象的引⽤计数器为零时,PHP知道你将不再需要使⽤这个对象,释放其所占的内存空间。
6.请写⼀段PHP代码,确保多个进程同时写⼊同⼀个⽂件成功(腾讯)
核⼼思路:加锁
<?php
$fp = fopen("","w+");
if (flock($fp,LOCK_EX)) {
/
/获得写锁,写数据
fwrite($fp, "write something");
// 解除锁定
flock($fp, LOCK_UN);
} else {
echo"file ";
}
fclose($fp);
>
7.写⼀个函数,尽可能⾼效的,从⼀个标准url⾥取出⽂件的扩展名,例如:)
// ⽅案⼀
function getExt1($url){
$arr = parse_url($url);
//Array ( [scheme] => http [host] => www.sina [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 = "www.sina/abc/de/fg.php?id=1";
echo getExt1($path);
echo"<br />";
echo getExt2($path);
>
相关题⽬:使⽤五种以上⽅式获取⼀个⽂件的扩展名,要求:dir/upload.image.jpg,出.jpg或者jpg,必须使⽤PHP⾃带的处理函数进⾏处理,⽅法不能明显重复,可以封装成函数,⽐如get_ext1(\(file_name),get_ext2(\)file_name)
8.写⼀个函数,能够遍历⼀个⽂件夹下的所有⽂件和⼦⽂件夹。(新浪)
<?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;
}
}
}
>
[]9.简述论坛中⽆限分类的实现原理。(新浪)
创建类别表如下:
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 DEFAULT0COMMENT'类别⽗ID'
)engine=MyISAM charset=utf8;
编写⼀个函数,递归遍历,实现⽆限分类
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;
}
>
10.写⼀个函数,算出两个⽂件的相对路径,如\(a='/a/b/c/d/e.php';\)b='/a/b/12/34/c.php';计算出\(b相对于\)a的相对路径应该是../../c/d(新浪)
<?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()的值。
12.有⼀个⽹页地址,⽐如PHP开发资源⽹主页:?
⽅法1(对于PHP5及更⾼版本):
$readcontents=fopen("www.phpres/index.html","rb");
$contents=stream_get_contents($readcontents);
fclose($readcontents);
echo$contents;
⽅法2:
echo file_get_contents("www.phpres/index.html");
13.谈谈对mvc的认识
由模型(model),视图(view),控制器(controller)完成的应⽤程序。
model层负责提供数据,和数据库有关的操作都交给模型层来处理,view层则提供交互的界⾯,并输出数据,⽽controller层则负责接收请求,并分发给相应的model来处理,然后调⽤view层来显⽰。
[!]14.What does the GD library do?(Yahoo)
GD库提供了⼀系列⽤来处理图⽚的API,使⽤GD库可以处理图⽚,或者⽣成图⽚。在⽹站上GD库通常⽤来⽣成缩略图或者⽤来对图⽚加⽔印或者对⽹站数据⽣成报表。⾃从PHP 4.3.0版本后GD便内建在PHP系统中。
15.What function can you use to open a file for reading and writing?(Yahoo)
A.fget();
B.file_open();
C.fopen();
D.open_file();
答案:C
fget()这不是⼀个PHP函数,会引致执⾏错误。
file_open()这不是⼀个PHP函数,会引致执⾏错误。
fopen()这是正确答案,fopen()可以⽤来开启档案以便读写。
open_file()这不是⼀个PHP函数,会引致执⾏错误。
[!!]16.Smarty的原理
smarty是⼀个模板引擎,使⽤smarty主要是为了实现逻辑和外在内容的分离,如果不使⽤模板的话,通常的做法就是php代码和html代码混编。使⽤了模板之后,则可以将业务逻辑都放到php⽂件中,⽽负责显⽰内容的模板则放到html⽂件中。
Smarty在执⾏display⽅法的时候,读取模板⽂件,并进⾏数据替换,⽣成编译⽂件,之后每次访问都会直接访问编译⽂件,读取编译⽂件省去了读取模板⽂件,和字符串替换的时间,所以可以更快,编译⽂件⾥时间戳记录模板⽂件修改时间,如果模板被修改过就可以检测到,然后重新编译(编译是把静态内容保存起来,动态内容根据传⼊的参数不同⽽不同)。
如果启⽤了缓存,则会根据编译⽂件⽣成缓存⽂件,在访问的时候如果有缓存⽂件并且缓存⽂件没有过期,则直接访问缓存⽂件。
相关题⽬1:能够使HTML和PHP分离开使⽤的模板
smarty,phplib等
相关题⽬2:您是否⽤过模板引擎?如果有您⽤的模板引擎的名字是?
Smarty
17.PHP如何实现页⾯跳转
⽅法⼆:利⽤meta
echo"<meta http-equiv=refresh content='0;url=⽹址'>";
18.PHP可以和sql server/oracle等数据库连接吗?
可以
19.使⽤哪些⼯具进⾏版本控制?
SVN或者CVS
相关题⽬:您是否⽤过版本控制软件?如果有您⽤的版本控制软件的名字是?
TortoiseSVN-1.2.6
20.写出⼀个正则表达式,过虑⽹页上的所有JS/VBS脚本(即把script标记及其内容都去掉):
过滤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中header是什么意思21.Given a line of text $string,how would you write a regular expression to strip all the HTML tags from it?(Yahoo)
⽅案⼀,使⽤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);
>
22.请写⼀个函数验证电⼦邮件的格式是否正确(要求使⽤正则)(新浪)
preg_match('/^[\w\-\.]+@[\w\-]+(\.\w+)+$/',$email);
相关题⽬:请⽤正则表达式写⼀个函数,验证电⼦邮件的格式是否正确。(鑫众⼈云)
23.请对POSIX风格和兼容Perl风格两种正则表达式的主要函数进⾏类⽐说明(腾讯)
主要区别有以下三种:
1. preg_replace()⾥⾯的正则可以写成型如:"/.xxx/"⽽ereg_replace()⾥⾯的正则需写成型如 "xxx"
2. preg_replace()能操作数组,⽽ereg_replace()不可以
3. 在逆向引⽤⽤preg_replace()可使⽤0-99个,⽽ereg_replace()最多为9个
使⽤Perl兼容正则表达式语法的preg_match()函数通常是⽐ereg()更快的替代⽅案。
24.请写出并说明如何在命令⾏下运⾏PHP脚本(写出两种⽅式)同时向PHP脚本传递参数?(腾讯)
⾸先进⼊php安装⽬录
php -f d:/wamp/www/1.php 其中-f参数指定要执⾏的php⽂件
php -r phpinfo(); 其中-r表⽰直接执⾏php代码,⽆需写开始结束标记
25.使⽤正则表达式提取⼀段标识语⾔(html或xml)代码段中指定标签的指定属性值(需考虑属性值对不规则的情况,如⼤⼩写不敏感,属性名值与等号间有空格等)。此处假设需提取test标签的attr属性值,请⾃⾏构建包含该标签的串(腾讯)
编写如下函数:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论