1、不用新变量直接交换现有两个变量的值
(1)list($a,$b)=array($b,$a);
(2)a=a+b,b=a-b,a=a-b
2、PHP数字金额转大小格式,同时说明思路
function daxie($num){
$da_num = array('零','一','二','三','四','五','六','七','八','九');
$return = '';
$len_num = strlen($num);
if(!is_numeric($num) || $len_num < 0){
return '';
}
for($i=0;$i<$len_num;$i++){
$return .= $da_num[ substr($num,$i,1)];
}
return$return;
}
3.SQL查询语句如下:select * from table
where id in (10,32,22,76,13,44)
order by charindex(id,'10,32,22,76,13,44') desc
4.用PHP打印出前一天的时间,格式是2006-5-10 22:21:21
(1) echo date ( 'Y-m-d H:i:s' ,time()-60*60*24);
(2) echo date ( 'Y-m-d H:i:s' , strtotime ( '-1 day' ))
|
5. echo(),print(),print_r()的区别
echo 是语言结构,无返回值; print 功能和 echo 基本相同,不同的是 print 是函数,有返回值;print_r是递归打印,用于输出数组或对象
|
6.能够使HTML和PHP分离开使用的模板
PHP本身是一种模版引擎,我用过的是smarty,常见的还有PHPLib,FastTemplate,Savant
|
7.使用哪些工具进行版本控制?
CVS和SVN,SVN号称下一代CVS,功能强大,不过CVS是老牌,市占率很高.CVS Server on Apache作服务端,WinCVS作客户端;
|
8.如何实现字符串翻转?
其实PHP本身就有字符串翻转的函数: strrev (),不过这种方法都不能解决中文字符串翻转的问题,会出错的。
function reverse( $var ) {
$res = "" ;
for ( $i =0, $j = strlen ( $var ); $i < $j ; $i ++) {
$res = $var [ $i ]. $res ;
}
return $res ;
}
$tmpvar = "wofang" ;
$res =reverse( $tmpvar );
echo $res ;
?>
|
(1).数据库设计方面,这是DBA和Architect的责任,设计结构良好的数据库,必要的时候,去正规化(英文是这个:denormalize),
(2).系统架构设计方面,表散列,把海量数据散列到几个不同的表里面.快慢表,快表只留最新数据,慢表是历史存档.集群,主服务器Read & write,
(3).(1)和(2)超越PHP Programmer的要求了,会更好,不会没关系.检查有没有少加索引
(4).写高效的SQL语句,看看有没有写低效的SQL语句,比如生成笛卡尔积的全连接啊,大量的Group By和order by,没有limit等等.
(5).所得皆必须,只从数据库取必需的数据,比如查询某篇文章的评论数,select count (*) … where article_id = ?
只传送必须的SQL语句,比如修改文章的时候,如果用户只修改了标题,那就update … set title = ? where article_id = ?
(6).必要的时候用不同的存储引擎.比如InnoDB可以减少死锁.HEAP可以提高一个数量级的查询速度
|
10.用PHP写出显示客户端IP与服务器IP的代码:
echo '客户端IP:' . $_SERVER [ 'REMOTE_ADDR' ]. ' ;
echo '服务器端IP:' . gethostbyname ( $_SERVER [ 'SERVER_NAME' ]);
|
11.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的URL记录在预定义变量(2)中。前执行脚本的绝对路径名(3),正在浏览当前页面用户的 IP 地址(4),查询(query)的字符串(URL 中第一个问号 ? 之后的内容):id=1&bi=2(5),当前运行脚本所在的文档根目录(6)。
(1) $_SERVER [ 'SCRIPT_FILENAME' ];或者 $_SERVER [ 'PHP_SELF' ] $_SERVER [ 'HTTP_REFERER' ]
(3) $_SERVER [ 'SCRIPT_FILENAME' ]; $_SERVER [ 'REMOTE_ADDR' ]; $_SERVER [ 'QUERY_STRING' ]; $_server [ 'DOCUMENT_ROOT' ];
|
12.执行程序段 将输出__。
(1) echo 8%(-2)。输出:0
(2) echo (-8)%3 .输出:-2
(3) echo 8%(-3).输出:2
|
13.数组函数 arsort 的作用是____;语句 error_reporting(2047)的作用是____。
arsort:对数组进行逆向排序并保持索引关系
error_reporting (2047)的作用是:report All errors and warnings
|
$a = "" ; echo preg_replace( '/\
24.GD库是做什么用的?
gd库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成图片。 在网站上GD库通常用来生成缩略图或者用来对图片加水印或者对网站数据生成报表。
=================================================================================================
在 $GLOBALS 数组中,每一个变量为一个元素,键名对应变量名,值对应变量的内容。$GLOBALS 之所以在全局范围内存在,是因为 $GLOBALS 是一个超全局变量。global 也就是说在一个文件里 只要你声明为global $db 那么在声明的下面 你就可以引用这个$db了。 21. 什么是静态变量? 如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。 一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时, 该变量会在函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量 不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。 22. php中函数传递参数的方式有哪些?两者有什么区别? 按值传递和按地址传递(或按引用传递) (1)按值传递: 待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对 该变量值做的修改,不影响原本的变量值。 (2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存 中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。 23. 什么是递归函数?如何进行递归调用? 递归函数其实就是调用自身的函数,但是必须满足以下两个条件: 1)在每一次调用自身时,必须是更接近于最终结果; 2)必须有一个确定的递归终止条件,不会造成死循环。 24. 判断一个函数是否存在? function_exists( string $function_name ) 如果存在,返回true, 不存在则返回 false。 25. func()和@func()之间有什么区别? 第二个函数调用失败不会报错,第一个会报错 26. include()和require()函数的用法和区别是什么?include_once()和require_once()呢? include和require出现错误后的错误级别不一样 include_once()和require_once()在加载之前要判断是否已经导入 27. 说出前置++和后置++的区别? 前置++是先将变量增加1,然后在将值赋值给原来的变量; 后置++是先返回变量的当前值,然后再将变量的当前值增加1. 28. 字符串运算符“.”与算术运算符“+”有什么区别? 当“a”“b”之间使用.时认为是连字符。如果两者间是+的时候php会认为是一次运算。 1)如果+号两边的字符串是数字组成的,那么会将字符串自动转为整型; 2)如果+号两边是纯粹的字母,那么会输出0; 3)如果+号两边的字符串是以数字开头的,那么会截取字符串开头的数字,然后进行运算。 29. 什么是三目(或三元)运算符? 根据一个表达式的结果在另两个表达式中选择一个。 例如: ($a==true) ? 'good':'bad'; 30. 控制流程语句有哪些? 1:三种程序结构 顺序结构、分支结构、循环结构 2:分支: if/esle/esleif/ switch/case/default 3: switch 需要注意的: case子句中的常量可以是整型、字符串型常量、 或者常量表达式,不允许是变量。 同一个switch子句中,case的值不能相同,否则只能取到首次出现case中的值。 4: 循环 for while do...while do...while 后面必须加入分号结尾。 while 和 do...while 的区别 5:break 和 continue 的区别。 break可以终止循环。 continue没有break强大,只能终止本次循环而进入到下一次循环中。 31. 数组的概念是什么?数组根据索引分为哪两种,如何区分?数组的赋值方式有哪两种? 数组是一个可以存储一组或一系列数值的变量(复合型变量) 索引数组(索引值为数字,以0开始)和关联数组(以字符串作为索引值) 数组的赋值方式有哪两种? 数组的声明方式主要有两种。 1.通过array()函数声明数组; 可以通过key=>value的方式分别定义索引和值,也可以不定义数组的索引下标,只给出数组的元素值。 2.直接为数组元素赋值,不需要调用array()函数。例如: $arr[0] = 1; $arr[1] = 2; 特别注意: 数组的下标如果是等价于整数的字符串值(但不能以0开头),则会被当作整数对待。 例如: $array[3] 与 $array['3'] 引用的是相同的一个元素,而 $array['03'] 引用的则就是另外的一个元素了。 32.数组如何遍历? ①for循环 ②foreach循环 用法如下:foreach($arr as $key=>$value){} ③list each 和while 配合起来循环 33. foeach数组的时候指针是如何指向的?list()/each()/while()循环数组的时候指针如何指向的呢? 当foreach开始执行的时候,数组内部的指针会自动指向第一个单元。因为foreach所操作的是指定数组的拷贝,而不是该数组本身。 而each()一个数组后,数组指针将停留在数组中的下一个单元或者碰到数组结尾时停留在最后一个单元。如果要再次使用each()遍历数组,必须要使用reset(). reset()将数组的内部指针倒回到第一个单元并返回第一个数组单元的值。 34. 如何计算数组长度(或者说计算数组中所有元素的个数)?字符串怎么取长度? count() -- 计算数组中的元素个数。 可以使用count(数组名)或者count(数组名,1),如果有第二个参数,并且是数字1,则表示递归统计数组元素的个数。 如果第二个参数是数字0,则等同于只有一个参数的count()函数。 sizeof() -- count() 的别名 字符串:strlen()、mb_strlen(); 35. 数组中相关的常用函数有哪些? 1) count --(sizeof别名)— 计算数组中的单元数目或对象中的属性个数 例如:int count ( mixed $var [, int $mode ] ) $var 通常都是数组类型,任何其它类型都只有一个单元。 $mode 默认值为0. 1为开启递归地对数组计数 2) in_array ( mixed $needle , array $haystack [, bool $strict ] ) — 检查数组中是否存在某个值。 如果 needle 是字符串,则比较是区分大小写的。 如果第三个参数 strict 的值为 TRUE 则 in_array() 函数还会检查 needle 的类型是否和 haystack 中的相同。 3) array_merge(array $array1 [, array $array2 [, array $... ]] ) 将一个或多个数组的单元合并起来,一个数组中的值附加在前一个数组的后面。返回作为结果的数组。 特别注意:如果输入的数组中有相同的字符串键名,则该键名后面的值将覆盖前一个值。然而,如果数组包含数字键名,后面的值将不会覆盖原来的值,而是附加到后面。 如果只给了一个数组并且该数组是数字索引的,则键名会以连续方式重新索引 4) 数组与字符串之间的转换 (1)explode ( string $separator , string $string [, int $limit ] ) 使用一个分隔字符来分隔一个字符串。 (2)implode ( string $glue , array $arr ) 使用一个连接符将数组中的每个单元连接为一个字符串。 join 为 implode 的别名 5) sort(array &$array [, int $sort_flags ]) — 对数组按照值排序,当本函数结束时数组单元将被从最低到最高重新安排。 36. 数组合并函数array_merge()和数组加法运算$arr + $arr2 的区别是什么? array_merge()->使用array_merge(),如果是关联数组合并,如果数组的键名相同,那么后面的值将覆盖前者;如果是数字索引数组合并,则不覆盖,而是 后者附加到前者后面。 "+"->使用数组加法运算,与array_merge()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃, 也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。 37. 字符串定义的时候单引号和双引号有什么区别? ” ” 双引号里面的字段会经过编译器解释,然后再当作HTML代码输出。 ‘ ‘ 单引号里面的不进行解释,直接输出。 38. echo(),print(),print_r()的区别? (1)echo 是语法,Output one or more strings,没有返回值; (2)print 是函数,不能输出数组和对象,Output a string,print有返回值; (3)print_r 是函数,可以输出数组。print_r是个比较有意思的函数,可以输出stirng、int、float、 array、object等,输出array时会用结构表示,print_r输出成功时返回true;而且print_r可以通过print_r($str,true)来,使print_r不输出而返回print_r处理后的值。此外,对于echo和print,基本以使用echo居多,因为其效率比print要高。 ================================================================================================= 39. 按照功能分类说说都有哪些字符串处理函数?这些函数的作用是什么? A. 字符串输出函数 (1)echo $a,$b,$c......; 是一个语言结构,而不是一个真正的函数。 (2)print($a) 本函数输出字符串。若成功则返回 1,失败返回 0 (3)print_r($a) (4)var_dump($a); 能输出类型、长度、值 B. 去除字符串首尾空格的函数: trim ltrim rtrim(别名:chop) 使用第二个参数,还可以去除指定的字符。 C. 转义字符串函数:addslashes() D. 获取字符串长度的函数:strlen() E. 截取字符串长度的的函数:substr() F. 检索字符串函数: strstr() , strpos() G. 替换字符串函数:str_replace() 40. 请给出以下问题的正确答案? 1).$arr = array('james', 'tom', 'symfony');请将$arr数组的值用’,’分割并合并成字符串输出? echo implode(‘,’,$arr); 2).$str = ‘jack,james,tom,symfony’; 请将$str用’,’分割,并把分割后的值放到$arr数组中? $arr = explode(‘,’,$str); 3).$arr = array(3,7,2,1,’d’,’abc’); 请将$arr按照从大到小的顺序排序,并保持其键值不变? arsort($arr); print_r($arr); 4).$mail = “gaofei@163.com”; 请将此邮箱的域(163.com)取出来并打印,看最多能写出几种方法? echo strstr($mail,'163'); echo substr($mail,7); $arr = explode("@",$mail); echo $arr[1]; 5). 如果有一个字符串,该字符串是“123,234,345,”。请问如何切割掉这个字符串最后一个逗号? 6). 获取随机数的函数有哪几个?mt_rand() 和 rand()哪个执行速度快? 41.页面字符出现乱码,怎么解决? 1.首先考虑当前文件是不是设置了字符集。查看是不是meta标签中写了charset,如果是php页面还可以看看是不是 在header()函数中指定了charset; 例如: header(“content-type:text/html;charset=utf-8”); 2.如果设置了字符集(也就是charset),那么判断当前文件保存的编码格式是否跟页面设置的字符集保持一致, 两者必须保持统一; 3.如果涉及到从数据库提取数据,那么判断数据库查询时的字符集是否跟当前页面设置的字符集一致,两者必须统一, 例如:mysql_query(“set names utf8”)。 42. 正则表达式是什么?php中有哪些常用的跟正则相关的函数?请写出一个email的正则,中国手机号码和座机号码的正则表达式? 正则表达式是用于描述字符排列模式的一种语法规则。正则表达式也叫做模式表达式。 网站开发中正则表达式最常用于表单提交信息前的客户端验证。 比如验证用户名是否输入正确,密码输入是否符合要求,email、手机号码等信息的输入是否合法。 在php中正则表达式主要用于字符串的分割、匹配、查找和替换操作。 preg系列函数可以处理。具体有以下几个: string preg_quote ( string str [, string delimiter] ) 转义正则表达式字符 正则表达式的特殊字符包括:. \\ + * ? [ ^ ] $ ( ) { } = ! < > | :。 preg_replace -- 执行正则表达式的搜索和替换 mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit] ) preg_replace_callback -- 用回调函数执行正则表达式的搜索和替换 mixed preg_replace_callback ( mixed pattern, callback callback, mixed subject [, int limit] ) preg_split -用正则表达式分割字符串 array preg_split ( string pattern, string subject [, int limit [, int flags]] ) 43. 如果想过滤掉某个字符串中所有的html标记使用哪个函数? 好像是用strip_tags函数吧 44. preg_replace()和 str_ireplace()两个函数在使用上有什么不同?preg_split()和split()函数如何使用? str_replace:这个应该作为字符串替换的首选方法,不过有一点需要注意,就是把最希望匹配的元素放在前面。 strtr: strtr在短字符串替换的时候也是挺高效的,不过search数组的下标长度的差别也对效率产生比较大的影响,还有就是没事最好不要使用strtr(string, string, string)这种形式(对于非单字节字符很容易产生乱码)。 preg_replace:这个不用说,可以使用正则匹配,功能绝对是最强的,不过也是要牺牲一点效率的。 45. 获取当前时间戳的函数主要有哪些?用PHP打印出今天的时间,格式是2010-12-10 22:21:21? 用PHP打印出前一天的时间格式是2010-12-10 22:21:21?如何把2010-12-25 10:30:25变成unix时间戳? echo date ("Y-m-d H:i:s" ,strtotime(‘-1,days’)); date('Y-m-d H:i:s',time()); $unix_time = strtotime("2009-9-2 10:30:25");//变成unix时间戳 echo date("Y-m-d H:i:s",$unix_time);//格式化为正常时间格式 46. 在url中用get传值的时候,若中文出现乱码,应该用哪个函数对中文进行编码? 用户在网站表单提交数据的时候,为了防止脚本攻击(比如用户输入),php端接收数据的时候,应该如何处理? 使用urlencode()对中文进行编码,使用urldecode()来解码。 使用htmlspecialchars($_POST[‘title’])来过滤表单传参就可以避免脚本攻击。 47. 连接数据库操作的步骤是什么?每一步的返回值是什么数据类型?尤其是mysql_query()返回什么数据类型?
$conn=mysql_pconnect("localhost","root","123456");//打开连接 54. 文件下载的时候如何使用header()函数? header("content-type: application/octet-stream;charset=UTF-8"); //在这里加utf-8和在上面定义有什么区别? header("accept-ranges: bytes"); header("accept-length: ".filesize($filedir.$filename)); header("content-disposition: attachment; filename=".$filedir.$filename); 55. 什么是ajax?ajax的原理是什么?ajax的核心技术是什么?ajax的优缺点是什么? ajax是asynchronous javascript and xml的缩写,是javascript、xml、css、DOM等多个技术的组合。 '$'是jQuery的别名. 页面中用户的请求通过ajax引擎异步地与服务器进行通信,服务器将请求的结果返回给这个ajax引擎, 最后由这个ajax引擎来决定将返回的数据显示到页面中的指定位置。Ajax最终实现了在一个页面的指定位置可以加载另一个页面所有的输出内容。 这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以ajax技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信, 减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。 Ajax的优点是: 1. 减轻了服务器端负担,将一部分以前由服务器负担的工作转移到客户端执行,利用客户端闲置的资源进行处理; 2. 在只局部刷新的情况下更新页面,增加了页面反应速度,使用户体验更友好。 Ajax的缺点是不利于seo推广优化,因为搜索引擎无法直接访问到ajax请求的内容。 ajax的核心技术是XMLHttpRequest,它是javascript中的一个对象。 56. jquery是什么?jquery简化ajax后的方法有哪些? jQuery是Javascript的一种框架。 $.get(),$.post(),$.ajax()。$是jQuery对象的别名。 代码如下: $.post(异步访问的url地址 , {'参数名' : 参数值} , function(msg){ $("#result").html(msg); }); $.get(异步访问的url地址 , {'参数名' : 参数值} , function(msg){ $("#result").html(msg); }); $.ajax({ type: "post", url: loadUrl, cache:false, data: "参数名=" + 参数值, success: function(msg) { $("#result").html(msg); } }); 57. 什么是会话控制? 简单地说会话控制就是跟踪和识别用户信息的机制。会话控制的思想就是能够在网站中跟踪一个变量,通过这个变量, 系统能识别出相应的用户信息,根据这个用户信息可以得知用户权限,从而展示给用户适合于其相应权限的页面内容。 目前最主要的会话跟踪方式有cookie,session。 58. 会话跟踪的基本步骤 1).访问与当前请求相关的会话对象 2).查找与会话相关的信息 3).存储会话信息 4).废弃会话数据 59. 使用cookie的注意事项有哪些? 1) setcookie()之前不可以有任何页面输出,就是空格,空白行也不可以; 2) setcookie()后,在当前页面调用$_COOKIE['cookiename']不会有输出,必须刷新或到下一个页面才可以看到cookie值; 3) 不同的浏览器对cookie处理不同,客户端可以禁用cookie,浏览器也可以闲置cookie的数量,一个浏览器能创建的cookie数量最多300个,并且每个不可以超过4kb, 每个web站点能设置的cookie总数不能超过20个。 4) cookie是保存在客户端的,用户禁用了cookie,那么setcookie就不会起作用了。所以不可以过度依赖cookie。 60. 使用session的时候,通过什么来表示当前用户,从而与其他用户进行区分? sessionid,通过session_id()函数可以取得当前的session_id。 61. session和cookie的使用步骤分别是什么?什么是sesssion和cookie的生命周期?session和cookie的区别是什么? cookie是保存在客户端机器的,对于未设置过期时间的cookie,cookie值会保存在机器的内存中,只要关闭浏览器则 cookie自动消失。如果设置了cookie的过期时间,那么浏览器会把cookie以文本文件的形式保存到硬盘中, 当再次打开浏览器时cookie值依然有效。 session是把用户需要存储的信息保存在服务器端。每个用户的session信息就像是键值对一样存储在服务器端, 其中的键就是sessionid,而值就是用户需要存储信息。服务器就是通过sessionid来区分存储的session信息是 哪个用户的。 两者最大的区别就是session存储在服务器端,而cookie是在客户端。session安全性更高,而cookie安全性弱。 session在web开发中具有非常重要的份量。它可以将用户正确登录后的信息记录到服务器的内存中,当用户以此身份 访问网站的管理后台时,无需再次登录即可得到身份确认。而没有正确登录的用户则不分配session空间,即便输入了 管理后台的访问地址也不能看到页面内容。通过session确定了用户对页面的操作权限。 使用session的步骤: 1. 启动session: 使用session_start()函数来启动。 2. 注册会话: 直接给$_SESSION数组添加元素即可。 3. 使用会话: 判断session是否为空或者是否已经注册,如果已经存在则像普通数组使用即可。 4. 删除会话: 1.可以使用unset删除单个session; 2.使用$_SESSION=array()的方式,一次注销所有的会话变量; 3.使用session_destroy()函数来彻底销毁session。 cookie怎么使用? 1. 记录用户访问的部分信息 2. 在页面间传递变量 3. 将所查看的internet页存储在cookies临时文件夹中,可以提高以后的浏览速度。 创建cookie: setcookie(string cookiename , string value , int expire); 读取cookie:通过超级全局数组$_COOKIE来读取浏览器端的cookie的值。 删除cookie:有两种方法 1.手工删除方法: 右击浏览器属性,可以看到删除cookies,执行操作即可将所有cookie文件删除。 2.setcookie()方法: 跟设置cookie的方法一样,不过此时将cookie的值设置为空,有效时间为0或小于当前时间戳。 ================================================================================================= 62. 如何设置一个cookie的名字为username,值为jack,并且让此cookie一周后失效? 一个浏览器最多可以产生多少个cookie,每个cookie文件最大不能超过多少? setcookie(‘username’,’jack’,time()+7*24*3600); 最多可以产生20个cookie,每个最多不超过4K 63. 设置或读取session之前,需要做什么? 可以直接在php.ini中开启session.auto_start = 1或者在页面头部用session_start(); 开启session,session_start()前面不能有任何输出,包括空行。 64. 在实际开发中,session在哪些场合使用? session用来存储用户登录信息和用在跨页面传值。 1)常用在用户登录成功后,将用户登录信息赋值给session; 2)用在验证码图片生成,当随机码生成后赋值给session。 65. 注销session会话的形式有几种? unset() $_SESSION=array(); session_destroy(); 66. 什么是OOP?什么是类和对象?什么是类属性? OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。属性和方法的集合就形成了类,类是面向对象编程的核心和基础, 通过类就将零散的用于实现某个功能的代码有效地管理起来了。 类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化, 类在实例化之后就是对象。类是对象的抽象概念,对象是类的实例化。 OOP具有三大特点:1. 封装性(又叫做隐藏性);2. 继承性; 3. 多态性。 OOP的优点:1、代码重用性高(省代码) 2、使程序的可维护性高(扩展性) 3、灵活性 67. 常用的属性的访问修饰符有哪些?分别代表什么含义? private,protected,public。 类外:public ,var 子类中:public,protected ,var 本类中:private,protected,public ,var 如果不使用这三个关键词,也可以使用var关键字。但是var不可以跟权限修饰词一起使用。var定义的变量,子类中可以访问到,类外也可以访问到,相当于public, 类前面:只能加final,abstract, 属性前面:必须有访问修饰符(private,protected,public,var), 方法前面:static,final,private,protected,public ,abstract 68. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用? $this 当前对象,self 当前类, parent 当前类的父类,$this在当前类中使用,使用->调用属性和方法。 self也在当前类中使用,不过需要使用::调用。 parent在类中使用。 69.类中如何定义常量、如何类中调用常量、如何在类外调用常量。 类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。 定义常量使用关键字const. 例如:const PI = 3.1415326; 无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象, 访问常量的格式都是类名加作用域操作符号(双冒号)来调用。 即:类名 :: 类常量名; 70. 作用域操作符::如何使用?都在哪些场合下使用? 调用类常量,调用静态方法。 71. 什么是魔术方法?常用的魔术方法有哪几个? 以__开头的系统自定义的方法。 __construct() __destruct() __autoload() __call() __tostring() 72. 什么是构造方法和析构方法? 构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。 php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。 如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数, 没有任何操作。析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。 析构方法的定义方法为:__destruct(); 因为php具有垃圾回收机制,能自动清除不再使用的对象,释放内存,一般情况下可以不手动创建析构方法。 73. __autoload()方法的工作原理是什么? 使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。 当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。 这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后 就执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。 使用自动载入的魔术函数可以不必要写很多个include或者require函数。 74. 什么是抽象类和接口?抽象类和接口有什么不同和相似的地方? 抽象类是一种不能被实例化的类,只能作为其他类的父类来使用。 抽象类是通过关键字 abstract 来声明的。 抽象类与普通类相似,都包含成员变量和成员方法,两者的区别在于,抽象类中至少要包含一个抽象方法, 抽象方法没有方法体,该方法天生就是要被子类重写的。 抽象方法的格式为:abstract function abstractMethod(); 因为php中只支持单继承,如果想实现多重继承,就要使用接口。也就是说子类可以实现多个接口。 接口是通过interface关键字来声明的,接口中的成员变量和方法都是public的,方法可以不写关键字public, 接口中的方法也是没有方法体。接口中的方法也天生就是要被子类实现的。 抽象类和接口实现的功能十分相似,最大的不同是接口能实现多继承。在应用中选择抽象类还是接口要看具体实现。 子类继承抽象类使用extends,子类实现接口使用implements。 抽象类至少有一个抽象方法吗?答:如果一个类声明成抽象类,里面可以没有抽象方法 如果一个类中有抽象方法,这个类必须是抽象类 75. __call的参数有几个,类型是什么,意义是什么? 魔术方法__call()的作用是当程序调用一个不存在或不可见的成员方法时,php会先调用__call()方法, 将那个不存在的方法的方法名和参数都存储下来。 __call()包含两个参数, 第一个参数是那个不存在的方法的方法名,是个字符串类型; 第二个参数是那个不存在的方法的所有参数,是个数组类型。 本人认为__call()方法的意义更多在于调试,可以定位到错误。同时可以捕捉异常,如果某个方法不存在, 则执行其它可替代方法。 76. smarty模板技术的用途是什么? 为了php与html分开,美工和程序员各司其职,互不干扰。 77.smarty配置主要有哪几项? 1. 引入smarty.class.php;2. 实例化smarty对象;3. 重新修改默认的模板路径;4. 重新修改默认的编译后文件的路径;5. 重新修改默认的配置文件的路径;6. 重新修改默认的cache的路径。7. 可以设置是否开启cache。8. 可以设置左侧和右侧定界符。 78. smarty在使用过程中需要注意哪些细节? Smarty是基于MVC概念的一种模板引擎,它将一个页面程序分成了两部分来实现:即视图层和控制层, 也就是说smarty技术将用户UI与php代码分离开。 这样程序员和美工各司其职,互不干扰。 smarty运用过程中要注意以下几个问题: 1.正确配置smarty。主要要实例化smarty对象,配置smarty模板文件的路径; 2.php页面中使用assign赋值 和 display显示页面; 3.smarty模板文件中不允许出现php代码段,所有的注释,变量,函数都要包含在定界符内。 A.{} B. foreach C. if else D. include E. literal 79. MVC的概念是什么?各层主要做什么工作? MVC(即模型-视图-控制器)是一种软件设计模式或者说编程思想。 M指Model模型层,V是View视图层(显示层或者用户界面),C是Controller控制器层。 使用mvc的目的是实现M和V分离,从而使得一个程序可以轻松使用不同的用户界面。 在网站开发中, 模型层一般负责对数据库表信息进行增删改查, 视图层负责显示页面内容, 控制器层在M和V之间起到调节作用,控制器层决定调用哪个model类的哪个方法, 执行完毕后由控制器层决定将结果assign到哪个view层。 80. 略 81. java语言中方法重写和重载分别代表什么意思?准确说php支持方法的重载吗?很多参考书中提到的php重载实际上该如何正确理解? php不支持方法的重载,很多书里提到的PHP‘重载’应该是‘重写’ 82. final关键字能定义类中的成员属性吗? 不能,类的成员属性只能由public ,private , protected ,var 来定义 83. final关键字定义的类能够被继承吗? final定义的类不能被继承 84. 说说static关键字的使用场合?static能用在class前吗?static可以跟public,protected,private一起使用吗?构造方法可以是static的吗? static可以在属性和方法前面使用,调用static属性或者方法时,只要将类载入就可用,不用实例化,static不能用在class的前面。static可以跟public,protected,private一起使用,在方法的前面; 构造方法不能是static 85. 接口可以实例化吗?抽象类能实例化吗? 答:接口和抽象类都不能被实例化 86. class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗? class前面可以加final,static; class前面不能加public,protected,private 87. 类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个? 类中的属性必须加修饰符,除了那3个以外,还可以加var 88. 如果echo一个数组,页面输出什么?echo一个对象呢?print一个数组或者对象呢? 页面只能输出“Array”;echo一个对象会出现错误提示。print一个数组时也只是输出“Array”,print一个对象出现错误提示, print和echo是一样的 89. __tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗? 当echo或者print一个对象时,就是自动触发。而且__tostring()必须要返回一个值 90. 什么是抽象方法? 在方法前面有abstract,而且方法没有方法体,连“{ }”也不能有 91. 如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗? 会,"Fatal error: Class t2 contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (t2::ee) in" 92. 如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗? 不会,如果一个类是抽象类,其中可以没有抽象方法,但是一个类中有个方法是抽象方法,那么这个类一定是一个抽象类 93.略 94. final 关键字的应用应注意的问题? 使用final关键字定义的类,禁止继承。 使用final关键字定义的方法,禁止重写。 95. 如果一个类既要继承一个父类,又要实现多个接口,该如何写? 书写格式例如: class MaleHuman extends Human implements Animal,Life { ... } ================================================================================================= 96. 什么是单点入口呢? 所谓单点入口就是整个应用程序只有一个入口,所有的实现都通过这个入口来转发,比如说在上面我们就使用index.php作为程序的单点入口,当然这个是可以由你自己任意控制的。 单点入口有几大好处:第一、一些系统全局处理的变量,类,方法都可以在这里进行处理。比如说你要对数据进行初步的过滤,你要模拟session处理,你要定义一些全局变量,甚至你要注册一些对象或者变量到注册器里面。第二、程序的架构更加清晰明了。 97. PHP提供了2套正则表达式函数库,分别是哪两套? (1) PCRE Perl兼容正则表达式:preg_ 为前缀 (2) POSIX 便携式的操作系统接口:ereg_ 为前缀 98. 正则表达式的组成? 由原子(普通字符,如英文字符),元字符(有特殊功用的字符),模式修正字符,一个正则表达式中,至少包含一个原子 99. 不常用魔术方法的触发时机? __isset() __unset()的触发时机 __sleep()、 __wakeup() 在对对象进行串行化的时候调用,如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变 推荐阅读
|