面试题汇总PHP程序.doc
面试题汇总PHP程序是什么?怎么做?为什么?专 博1、写出五种以上你使用过的PHP的扩展的名称(提示:常用的PHP扩展)mysql、gd2、pdo、curl、mbstring、soap等,在php.ini中可以找到。尽量多了解一些扩展,了解他们的功能(能做什么)。2、了解MVC模式吗?请写出三种以上目前PHP流行的MVC框架名称(不区分大小写)MVC是Model(模型)、View(视觉)、Controll(控制器)的缩写。MVC(Model-View-Controller)介绍模型(Model): 应用程序的模型部分关心的是欲显示的数据的细节。模型通常关注的是应用程序的业务逻辑部分,关注的是如何使用数据库来读取和保存数据。视图(View): 视图关心的是用户显示的部分,它通常是HTML。控制器(Controller):控制器将特定的模型和视图结合起来,保证将正确的数据显示到页面上。常用的MVC框架:Zend FrameworkFleaPHPCakePHPThinkPHPCI大家有时间可以对框架进入多一些的深入了解。3、用PHP打印出前一天的时间格式是2008-2-8 18:00:10echo '昨天:', date('Y-m-d H:i:s', strtotime('-1 day'), "<br />"echo '昨天:', date('Y-m-d H:i:s', mktime (date('H'), date('i'), date('s'), date("m"), date("d")-1, date("Y"), "<br />"参考strtotime.php mktime.php4、echo(),print(),print_r()的区别 var_dump()echo与print:它们都不是真正的函数,是一种语法结构(也有说print是函数,echo不是)。echo和print 后面都可不用加(),如: echo 'ok' print 'ok'运行速度echo稍快一些,因为echo并不返回值,print返回一个值int(1)。结论:1、一般用echo,除非三元运算时。$a=5; ($a=5) ? print '5': print 0;2、echo 后不要跟()。print_r是递归打印,主要用于输出数组对象。3、print只能有一个参数,所以不能不能用",",而echo可以。参考 echo_print_print_r.php5、能够使HTML和PHP分离开使用的模板其实PHP本身就是一种模版引擎。参考require.php常用的模板引擎:smarty,还有PHPLib,FastTemplate,Savant等。模板引擎列表:6、如何实现字符串翻转?可用内置函数strrev。如果不准用PHP内置函数的就自己写:参考strrev2.phpHello->olleH7、$a = "hello"$b = &$a;unset($b);$b = "world"what is $a? 参考references.php 此题的目的是要深刻理解引用。通常,在将一个变量的值赋给另外一个变量的时候,先产生原变量的一个副本,然后再将它保存在内存的其他地方。如:$a = 5;$b = $a;首先产生$a的一个副本,然后再将它保存到$b中。如果随后改变$a的值,$b的值不会改变:$a = 7; /这时$b仍然是5可以使用引用操作符&来避免这样的副本。如:$a = 5;$b = &$a;$b = 7; /这时$a和$b都会是7。 这行也可以换成$b = 7;引用是非常有趣的。请记住,引用就像一个别名,而不是一个指针。$a和$b都指向了内存的相同地址。可以通过重置它们来改变所指向的地址。如下所示:unset($a);重置并不会改变$b的值,但是只可以破坏$a和值7保存在内存中的连接。可以搜索: 引用 site: 进一步深入了解PHP的引用。也可以直接访问这个页面:当 unset 一个引用,只是断开了变量名和变量内容之间的绑定。这并不意味着变量内容被销毁了。例如:<?php$a = 1;$b =& $a;unset($a);?>不会 unset $b,只是 $a。 8、实现中文字串截取无乱码的方法。a.可以用正则b.用mb_substr()参考mb_substr.php北京abc substr9、$a = 1;$x = &$a;$b = $a+;what is $b? $x?参考references2.php10、$array = array();$x = empty($array);what is $x? true or false参考 empty.php什么样的内容为空?empty()、isset()、is_null11、用PHP写出显示客户端IP与服务器IP的代码得到服务器端的IP:gethostbyname() 参考gethostbyname.php 有时候得不到。$_SERVER'SERVER_ADDR'得到客户端的IP:$_SERVER'REMOTE_ADDR'参考ip.php12、某内容管理系统:用户提交内容后,系统生成静态HTML页面;写出实现的基本思路,最好写出相关代码。用户提交内容后,将内容加在最终页面模板上,然后另存为HTML页面(创建HTML页面,将内容和页面模板写入)。代码:$tpl->assign('vars', $vars);$static_html = = $tpl->fetch('tpl/index.html'); /Smarty的fetch方法$fp = fopen('html/index.html', 'w');fwrite($fp, $static_html);13、写出以下程序的输出结果$b=201;$c=40;$a=$b>$c?4:5;echo $a;参考3yuan.php14、写出以下程序的输出结果$str="cd"$str="hotdog"$str.="ok"echo $cd;参考$.php15、在PHP中error_reporting这个函数有什么作用?设定php脚本的错误报告级别error_reporting(6143)的作用是设定php脚本的错误报告级别为“所有错误”。ini_set('display_errors', 1); /作用是在显示PHP脚本错误,相当于修改php.ini中的display_errors16、简述如何得到当前执行脚本路径,包括所得到参数。访问echo $_SERVER'SCRIPT_URL' /得到/phpinfo.phpecho $_SERVER"SCRIPT_URI" /得到 echo $_SERVER"SCRIPT_FILENAME" /得到F:/www/Temp/phpinfo.phpecho $_SERVER"REQUEST_URI" /得到/phpinfo.php?id=1echo $_SERVER"SCRIPT_NAME" /得到/phpinfo.php参考server.php 17、有一个网页地址 ,如何得到它的html内容file_get_contents()18、数组函数 arsort 的作用是_。对数组进行逆向排序并保持索引关系参考arsort.php19、执行程序段<?php echo 8%(-2) ?>将输出_。参考%.php20、语句 include 和 require 都能把另外一个文件包含到当前文件中,它们的区别是_;为了避免多次包含同一文件,可以用语句_来代替它们。发生异常时include产生警告,程序继续执行;require产生致命错误,程序停止往下执行。一般推荐使用require(更能调试错误)。require_once()/include_once()require重复调用会多次加载你饮用的文件;require_once只加载一次,而不管你实际上调用了多少次,主要用于复杂的文件包含关系。例如b包含a,c包含a,但同时c又包含了b,那么如果用require的话可能会导致两次加载a,这时应使用require_once。实际开发过程中:如果确定某个文件只会被包含一次,那么用 require,否则用require_once。因为require不需要检测文件是否被包含过,比require_once 的执行效率要高。21、一个函数的参数不能是对变量的引用,除非在php.ini中把_设为on。allow_call_time_pass_reference22、在PHP中,heredoc是一种特殊的字符串,它的结束标志必须_。结束标识符所在的行不能包含任何其它字符除""参考heredoc.php23、有一数组$a=array(3,2,4,9,8);请将其重新排序,按从小到大的顺序列出。可用冒泡法进行排序:冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后,此时第一趟结束,在最后的数必是所有数中的最大数。重复以上过程,仍从第一对数开始比较(因为可能由于第2个数和第3个数的交换,使得第1个数不再小于第2个数),将小数放前,大数放后,一直比较到最大数前的一对相邻数,将小数放前,大数放后,第二趟结束,在倒数第二个数中得到一个新的最大数。如此下去,直至最终完成排序。参考array1.php array2.php24、写出session的运行机制。session创建时,是否会在客户端记录一个cookie?cookie里面的内容是什么?session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。当程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否已包含了一个session标识-称为sessionid,如果已包含一个sessionid则说明以前已经为此客户端创建过session,服务器就按照sessionid把这个session检索出来使用(如果检索不到,可能会新建一个),如果客户端请求不包含sessionid,则为此客户端创建一个session并且生成一个与此session相关联的sessionid,sessionid的值应该是一个既不会重复,又不容易被找到规律以仿造的字符串,这个sessionid将被在本次响应中返回给客户端保存。保存这个sessionid的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发给服务器。一般这个cookie的名字都是类似于SEEESIONID。由于cookie可以被人为的禁止,必须有其他机制以便在cookie被禁止时仍然能够把sessionid传递回服务器。经常被使用的一种技术叫做URL重写,就是把sessionid直接附加在URL路径的后面,附加方式也有两种,一种是作为URL路径的附加信息,表现形式为http:/./xxx;SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!- 另一种是作为查询字符串附加在URL后面,表现形式为http:/./xxx?SEEESIONID=ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-为了在整个交互过程中始终保持状态,就必须在每个客户端可能请求的路径后面都包含这个SEEESIONID。 参考:session运行机制:理解session机制:抛开cookie使用session:cookie与session:25、Cookie的原理及使用?Cookie是网站保存在浏览器客户端的信息,也就是说保存在访客的机器里的变量,一般随着HTTP头发送到服务器端。在Cookie生效之后及失效之前,客户每次发出页面请求的时候(包括PHP页面和静态html页面),都会把Cookie一块发送到服务器,只要我们针对它进行相应的处理,就可以实现变量“追随”。 cookie可以跨越子域名。比如我们在下面注册个个cookie,那么可以在上读取到该cookie。session不可以跨越子域名:比如我们在下面注册个个session,那么不可以在,上读取到该session。a 设置一个Cookie变量 设置一个Cookie变量,PHP使用的函数是: int setcookie(string name, string value, int expire, string path, string domain, int secure); 其中name是Cookie变量名称标识,你在PHP中将可以象使用普通变量名一样来用它引用Cookie变量。value是Cookie变量的初始值,expire 表示该Cookie变量的有效时间;path 为该Cookie变量的相关路径;domain 表示Cookie变量的网站;secure 则需在 https 的安全传输时才有效。 例如我们要设置一个变量username,它的值是字符串“bluewind”,我们可以这么写代码: setcookie (“username”,“bluewind”); /这两个参数是setcookie必要的。 我们还想给这个变量设置有效时间来限制操作超时等,比如说10分钟: setcookie (“username”,“bluewind”, ); /有效时间的单位是毫秒。 注意:setcookie和header函数一样,需要放在任何能向客户端输出的语句之前。 b 销毁一个变量 销毁Cookie变量只要将它的value设为空(“”)就可以了,如想销毁上面那个变量只要再写一次: setcookie (“username” ,“”); 就可以了。这常用作安全退出之用。 c Cookie的有效范围和生存期 Cookie的有效范围(也就是说在这个范围的页面都能得到这个Cookie变量)默认的是该目录及其子目录,当然你可以用setcookie的path和domain参数进行修改。如果你不对cookie的expire进行设置(参见1. 设置一个Cookie变量中的例子),那么当你离开网站的页面,cookie也同时得到自动销毁。 cookie 原创者 Netscape 所提供的完整介绍信息。 26、PHP的意思(英文全称、含义)php是Hypertext Preprocessor的缩写,php是一种内嵌HTML的脚本语言。PHP的独特语法混合了c,java和perl及PHP式的新语法。这门语言的的目标是让网页开发人员快速的写出动态的网页。Personal HomePage toolsHypertext Preprocessor Hypertext Preprocessor .27、foo()和foo()之间有什么区别?foo() 会执行这个函式,任何解译错误、语法错误、执行错误都会在页面上显示出来。foo() 在执行这个函数时,会隐藏所有上述的错误讯息。很多应用程式都使用 mysql_connect() 和 mysql_query 来隐藏 mysql 的错误讯息,我认为这是很严重的失误,因为错误不该被隐藏,你必须妥善处理它们,可能的话解决它们。28、如何声明一个名为”myclass”的没有方法和属性的类?class myclass29、如何实例化一个名为”myclass”的对象?$myclass = new myclass;30、你如何访问和设置一个类的属性?$myclass->username = 'andy'31、GD库是做什么用的?GD 函式库用来做什么?这个可能是我最喜欢的函式库,自从 PHP 4.3.0 版本后 GD 便内建在 PHP 系统中。这个函式库让你处理和显示各式格式的图档,它的另一个常见用途是制作所图档。GD 以外的另一个选择是 ImageMagick,但这个函式库并不内建于 PHP 之中,必须由系统管理员安装在伺服器上。 MagickWand32、指出一些在PHP输入一段HTML代码的办法。嗯,你可以使用 PHP 中任何一种输出语句,包括 echo、print、printf,大部分人都使用如下例的 echo:echo "My string $variable"你也可以使用这种方法:echo <<<ENDThis text is written to the screen as output and this $variable is parsed too. If you wanted you can have <span> HTML tags in here as well.</span> The END; remarks must be on a line of its own, and can't contain any extra white space.END;33、下面哪个函数可以打开一个文件,以对文件进行读和写操作? c(a) fget() (b) file_open() (c) fopen() (d) open_file()34、下面哪个选项没有将 john 添加到users 数组中? bd(a) $users = 'john'(b) array_add($users, 'john');(c) array_push($users, 'john', 'andy');(d) $users |= 'john'35、如何使用下面的类,并解释下面什么意思?class Mymd5function get_md5($str)$str=md5(md5($str)."xingmo");return $str;参考 mymd5.php36、检测一个变量是否有设置的函数是否?是否为空的函数是?是否为NULL?isset()、 empey、is_null()要深刻理解这几个的含义。37、$arr = array('james', 'tom', 'symfony'); 请打印出第一个元素的值a.echo $arr0;b.echo $arr1;c. $arr2 = array_shift($arr); echo $arr2;array_pop38、请将数组的值用','号分隔并合并成字符串输出。如何将一个以','隔开的字符串分割成数组?参考 implode.php 把数组变成字符串要掌握implode和explode的用法。39、$a = 'abcdef' 请打印出$a的第一个字母。echo $a0;echo $a0;substr($a, 1);最好是用。40、PHP可以和sql server/oracle等数据库连接吗?可以。可以用PDO连接。41、请写出php5的构造函数和析构函数function _construct()function _destruct()42、写一个函数,尽可能高效的,从一个标准 url 里取出文件的扩展名例如: 需要取出 php 或 .php参考url1.php43、求两个日期的差数,例如2007-2-5 2007-3-6 的日期差数(天数)。思路1:先用strtotime转换成unix时间戳,然后相减,除以86400.思路2:先用mktime转换成unix时间戳,然后相减,除以86400.参考 time1.php44、请写一个函数,实现以下功能:字符串“open_door” 转换成 “OpenDoor”、”make_by_id” 转换成 ”MakeById”。思路:1)将'_'替换成' '2)使用ucwords()将各单词首字母大写;3)去掉空格;str_replace()45、要求写一段程序,实现以下数组$arr1转换成数组$arr2:$arr1 = array ( '0' => array ('fid' => 1, 'tid' => 1, 'name' =>'Name1' ), '1' => array ('fid' => 1, 'tid' => 2 , 'name' =>'Name2' ), '2' => array ('fid' => 1, 'tid' => 5 , 'name' =>'Name3' ), '3' => array ('fid' => 1, 'tid' => 7 , 'name' =>'Name4' ), '4' => array ('fid' => 3, 'tid' => 9, 'name' =>'Name5' ) );$arr2 = array ( '0' => array ( '0' => array ( 'tid' => 1, 'name' => 'Name1'), '1' => array ( 'tid' => 2, 'name' => 'Name2'), '2' => array ( 'tid' => 5, 'name' => 'Name3'), '3' => array ( 'tid' => 7, 'name' => 'Name4') ), '1' => array ( '0' => array ( 'tid' => 9, 'name' => 'Name5' ) );本题主要目的是要对数组熟练掌握,特别是foreach的用法。46、如果模板是用smarty模板。怎样用section语句来显示一个名为$data的数组。比如:$data = array( 0 => array( 'id'=>8, 'name'=>'name1'), 1 => array( 'id'=>10, 'name'=>'name2'), 2 => array( id=15 name='name3')写出在模板页的代码? 若用foreach语句又要怎样显示呢?section和foreach循环二维数组的基本功。section和foreach循环一维数组?section和foreach循环三维数组?47、不用新变量直接交换现有两个变理的值。考算法的基本功。$a = 'welcome'$b = 'beijing'$a = '|'.$a.'|'.'|'.$b.'|' /|welcome|beijing|$b = str_replace( '|'.$b.'|', '', $a);$b = trim($b, '|');$a = str_replace( '|'.$b.'|', '', $a);$a = trim($a, '|');echo $a;echo $b;48、PHP数字金额转中文大写格式,同时说明思路(考数组掌握)。49、写一个函数,能够遍历一个文件夹下的所有文件和子文件夹。50、表单中 get与post提交方法的区别?a、Get 方法通过 URL 请求来传递用户的数据,将表单内各字段名称与其内容,以成对的字符串连接,置于 action 属性所指程序的 url 后,如 url 上,就像用户点击一个链接一样;Post 方法通过 HTTP post 机制,将表单内各字段名称与其内容放置在 HTML 表头(header)内一起传送给服务器端交由 action 属性能所指的程序处理,该程序会通过标准输入(stdin)方式,将表单的数据读出并加以处理b、 Get 方式需要使用 $_GET 来取得变量的值;而 Post 方式通过 $_POST 来访问提交的内容c、Get 方式传输的数据量非常小,一般限制在 2 KB 左右,但是执行效率却比 Post 方法好;而 Post 方式传递的数据量相对较大,它是等待服务器来读取数据,不过也有字节限制,这是为了避免对服务器用大量数据进行恶意攻击。可在php.in中 对 post_max_size 进行设置。建议:除非你肯定你提交的数据可以一次性提交,否则请尽量用 Post 方法d、Get 方式提交数据,会带来安全问题,比如一个登陆页面,通过 Get 方式提交数据时,用户名和密码将出现在 URL 上,如果页面可以被缓存或者其他人可以访问客户这台机器,就可以从历史记录获得该用户的帐号和密码,所以表单提交建议使用 Post 方法;Post 方法提交的表单页面常见的问题是,该页面如果刷新的时候,会弹出一个对话框。建议:出于安全性考虑,建议最好使用 Post 提交数据*在B/S应用程序中,前台与后台的数据交互,都是通过HTML中Form表单完成的。Form提供了两种数据传输的方式get和post。虽然它们都是数据的提交方式,但是在实际传输时确有很大的不同,并且可能会对数据产生严重的影响。虽然为了方便的得到变量值,Web容器已经屏蔽了二者的一些差异,但是了解二者的差异在以后的编程也会很有帮助的。Form中的get和post方法,在数据传输过程中分别对应了HTTP协议中的GET和POST方法。二者主要区别如下:a、Get是用来从服务器上获得数据,而Post是用来向服务器上传递数据。b、Get将表单中数据的按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。c、Get是不安全的,因为在传输过程,数据被放在请求的URL中,而如今现有的很多服务器、代理服务器或者用户代理都会将请求URL记录到日志文件中,然后放在某个地方,这样就可能会有一些隐私的信息被第三方看到。另外,用户也可以在浏览器上直接看到提交的数据,一些系统内部消息将会一同显示在用户面前。Post的所有操作对用户来说都是不可见的。d、Get传输的数据量小,这主要是因为受URL长度限制;而Post可以传输大量的数据,所以在上传文件只能使用Post(当然还有一个原因,将在后面的提到)。e、Get限制Form表单的数据集的值必须为ASCII字符;而Post支持整个ISO10646字符集。f、Get是Form的默认方法。*.Post传输数据时,不需要在URL中显示出来,而Get方法要在URL中显示。 *.Post传输的数据量大,可以达到2M,而Get方法由于受到URL长度的限制,只能传递大约1024字节. *.Post顾名思义,就是为了将数据传送到服务器段,Get就是为了从服务器段取得数据.而Get之所以也能传送数据,只是用来设计告诉服务器,你到底需要什么样的数据.Post的信息作为http请求的内容,而Get是在Http头部传输的。51、session与cookie的区别?session是服务器端缓存,cookie是客户端缓存。cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。52、PHP支持的数据类型有八种,以下被支持的有:stringintfloatarrayboolNULLresourceobject A、array B、floating-point numbers(double) C、integer D、dateE、string A B C E PHP的变量属于松散数据类型,在计算时动态(dynamic)决定。如果要强制设置变量的数据类型的话,可以利用 settype()函数。或利用 c 语言的强制转型方式(type casting)。53、假定要使用Apache+Php的配置,并将php3编译成Apache的一个模块。那麽以下httpd.conf文件的语句是必须的:【C】 A、AddModule mod_php3.c B、LoadModule php3_module libexec/libphp3.so C、AddType application/x-httpd-php3.php3 D、setupE、make install54、以下程序:<HTML><HEAD><TITLE></TITLE><HEAD><BODY><?php $num1 = 15; $num2 = $num1; echo "<p>$num2</p>" $num2 = &$num1; $num2 = 20; echo "<p>$num1</p>"?></BODY></HTML>程序输出为: A、15 B、35 C、20D、5AC55、以下程序<?php $str1 = "01" $str1+; $str1 += 1; echo "<p>/$str1 => $str1</p>"?>程序输出为: A、$str1 => 01 B、$str1 => 2 C、$str1 => 03 D、$str1 => 3E、$str1 => 1D参考math1.php56、全局变量与局部变量$a=1;sum() echo $a;sum();程序输出为: A、1 B、10 C、100 D、1000E、空值E57、PHP的控制语句<?php $a = 3; $b = $a+; if ($a > $b) echo "a 比 b 大" elseif ($a = $b) echo "a 等于 b" else echo "a 比 b 小" ?>输出结果为: A、a 比 b 大 B、a 等于 b C、a 比 b 小 D、"a 比 b 小"E、无输出A58、PHP对字符串的处理程序 $name="Jollen" echo 'Name:$name' echo "Name:$name"输出结果为: A、Name:Jollen Name:Jollen B、Name:Jollen Name:$name C、Name:$name Name:Jollen D、Name:$name Name:$name E、Name:"Jollen" Name:JollenC此题考单引号与双引号的基本功。59、下面建立与MySQL Server的连接语法正确的是: A、$link=connect("host_name","user_name","password"); B、$link=mysql_connect("host_name","user_name","password"); C、$link=mysqlconnect("host_name","user_name","password"); D、$link=mysql_pconnect("host_name","user_name","password");E、$link=pconnect("host_name","use