搜档网
当前位置:搜档网 › php综合复习题大全_100题(80)

php综合复习题大全_100题(80)

?1. 变量如何定义?如何检查变量是否定义?如何删除一个变量?判断一个变量是否为空的函数?
isset()
unset()
empty()

2. 什么是可变变量?
$hello = "world";
$$hello;//$world

3. 变量赋值方式有哪几种?
1)直接赋值 $str = 123;
2)变量间赋值
$arr = array();
$arr[] = 123;
$arr[] = 456;
$a;
$a = 123;
3)引用赋值
$a = 123;
$b = $a;

4. 引用和拷贝有什么区别?
拷贝是将原来的变量内容复制下来,拷贝后的变量与原来的变量使用各自的内存,互不干扰。
引用相当于是变量的别名,其实就是用不同的名字访问同一个变量内容。当改变其中一个变量的值时,另一个也跟着发生变化。


5. php中变量有哪些基本数据类型?
php支持8种原始数据类型。
包括:
四种标量类型(布尔型boolean,整型interger,浮点型float/double , 字符串string)
两种复合类型(数组array , 对象object)
两种特殊类型(资源resource,NULL)


6. 其它类型转换为boolean类型时,哪些被认为是false?
布尔值false,整型值0, 浮点型值0.0, 空白字符串, 字符串'0', 空数组,空对象, 特殊数据类型NULL, 没有设定的变量。

empty()函数在哪些情况下返回true?
布尔值false,
整型值0,
浮点型值0.0,
空白字符串,
字符串'0',
array()空数组,
特殊数据类型NULL,
没有任何属性的对象,
没有赋值的变量。


7. 如果定义了一个变量$a ,但是没有赋初始值,那么$a==0吗?
$a==false吗? $a==''吗?$a==NULL吗?
$a===NULL吗?empty($b)==true吗?
此时如果输出$a++是多少?如果输出++$a又是多少?


8. 字符串怎么转成整数,有几种方法?怎么实现?
强制类型转换: (整型)字符串变量名;
$a = "123";
var_dump((int)$a);
直接转换:settype(字符串变量,整型);
$a = "123";
settype($a,'int');
var_dump($a);
intval(字符串变量);
$a = "123";
$b = intval($a);
var_dump($b);

9. 标量数据和数组的最大区别是什么?
一个标量只能存放一个数据,而数组可以存放多个数据。


10. 常量如何定义? 如何检测一个常量是否被定义?常量的值只能是哪些数据类型?
define() , defined()
常量的值只能是标量类型的数据。


11. 常量分为系统内置常量和自定义常量。请说出最常见的几个系统内置常量?
__FILE__ , __LINE__ , PHP_OS , PHP_VERSION

12. 如果定义了两个相同的常量,前者和后者哪个起作用?
前者起作用,因为常量一旦定义就不能被重新定义或者取消定义。


13. 常量和变量有哪些区别?
1)常量前没有$符号;
2)常量只能通过define

()定义,而不能通过赋值语句定义;
3)常量可以在任何地方定义和访问,而变量定义的反问有固定的规则;
4)常量一旦定义就不能被重新定义或者取消定义,而变量而通过赋值方式重新定义;
5)常量的值只能是标量数据,而变量的数据库类型有8中原始数据类型。




14. PHP中常用的几个预定义的全局数组变量是哪些?
有9大预定义的内置数组变量:
$_POST, $_GET, $_REQUEST['name'], $_SESSION, $_COOKIE, $_FILES,$_SERVER, $_ENV, $GLOBALS

15. 在实际开发中,常量最常用于哪些地方?
1)连接数据库的信息定义成常量,如数据库服务器的用户名、密码、数据库名、主机名;
2)将站点的部分路径定义成常量,如web绝对路径,smarty的安装路径,model、view或者controller的文件夹路径;
3)网站的公共信息,如网站名称,网站关键词等信息。

16. 函数的优越性有哪些?
提高程序的可维护性
提高软件的可靠性
提高程序的可重用性
提高程序的开发效率


17. 如何定义一个函数?函数名区分大小写吗?
1)使用 function 关键字;
2)函数命名规则和变量一样,以字母或者下划线开头,而不能以数字开头;
3)函数名不区分大小写;
4)函数名不可以使用已经声明过的或者系统自建的函数名称。


18. 什么是变量的能见度或者说是变量作用域?
就是变量在程序中的可作用范围。根据变量的能见度,变量分为局部变量和全局变量。


19. 什么是局部变量和全局变量?函数内是否可以直接调用全局变量?
局部变量是函数内部定义的变量,其作用域是所在的函数。如果函数外还有一个跟局部变量名字一样的变量,
程序会认为它们两个是完全不同的两个变量。当退出函数的时候,其中的局部变量就同时被清除。

全局变量是定义在所有函数以外的变量,其作用域是整个php文件,但是在用户自定义的函数内部是无法使用的。
如果一定要在用户自定义的函数内部使用全局变量,那么就需要使用global关键字声明。
也就是说如果在函数内的变量前加上golbal来修饰,那么函数内部就可以访问到这个全局变量,
不仅可以利用这个全局变量进行运算而且可以对这个全局变量进行重新赋值。
全局变量还可以使用 $GLOBALS['var'] 来调用。


20. global关键词如何使用?预定义的全局变量数组$GLOBALS如何使用?


21. 什么是静态变量?
如果一个函数内定义的变量前使用关键字static来声明,那么该变量就是静态变量。
一般函数内的变量在函数调用结束后,其存储的数据将被清除,所占的内存空间也被释放。而使用静态变量时,
该变量会在

函数第一次被调用时被初始化,初始化后该变量也不会被清除,当再次调用该函数时,这个静态变量
不再被初始化,而能保存上次函数执行完后的值。可以说静态变量在所有对该函数的调用之间共享。


22. php中函数传递参数的方式有哪些?两者有什么区别?
按值传递和按地址传递(或按引用传递)
(1)按值传递: 待传递的变量,与传递给函数之后的变量是存储在不同的空间中。所以函数体内对
该变量值做的修改,不影响原本的变量值。

(2)按地址传递: 使用 & 符号,表明该参数是以地址的方式传递值。并不会将主程序中的指定数值或目标变量传递给函数,
而是把该数值或变量的内存储存区块地址导入函数之中,所以函数体内的该变量和主程序中的该变量在内存
中是同一个。函数体做的修改,直接影响到函数体外部的该变量的值。


23. 什么是递归函数?如何进行递归调用?
递归函数其实就是调用自身的函数,但是必须满足以下两个条件:
1)在每一次调用自身时,必须是更接近于最终结果;
2)必须有一个确定的递归终止条件,不会造成死循环。
举例说明:
在实际工作中往往会在遍历文件夹的时候使用。
如果有个例子是希望获取到目录windows下所有的文件,那么先遍历windows目录,如果发现其中还有文件夹,那么就会调用自身,继续往下寻找,依次类推,
直到遍历到再也没有文件夹为止,这也就是意味着遍历出来了所有的文件。


24. 判断一个函数是否存在?
function_exists ( string $function_name ) 如果存在,返回true, 不存在则返回 false。


25. func()和@func()之间有什么区别?
第二个函数调用失败不会报错,第一个会报错

26. 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/else/elseif/ 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循环
$arr[] = 123;
$arr[] = 456;
$arr[] = 789;
for($i=0; $iecho $arr[$i]."
";
}
②foreach循环 ,这是最常用的遍历方式。用法如下:foreach($arr as $key=>$value){}
③list each 和while 配合起来循环


33. foreach数组的时候指针是如何指向的?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()不同,加法运算不管是关联数组还是数字索引数组,都是将相同键名的的值舍弃,
也就是只保留首次出现该键名的元素,后来的具有相同键名的元素都不会被加进来。


37. 字符串定义的时候单引号和双引号有什么区别?




38. echo(),print(),print_r()的区别?
(1)echo 是语法,Output one or more strings,没有返回值;
echo $a,$b,$c;
(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@https://www.sodocs.net/doc/5514833774.html,”; 请将此邮箱的域(https://www.sodocs.net/doc/5514833774.html,)取出来并打印,看最多能写出几种方法?
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”)。




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());
mktime(小时,分钟,秒,月,天,年);//将时间信息转化为时间戳
$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()返回什么数据类型?

48. 说说mysql_fetch_row() 和mysql_fetch_assoc()和mysql_fetch_array之间有什么区别?
第一个是返回结果集中的一行作为索引数组,第二个是返回关联数组,而第三个既可以返回索引数组也可以返回关联数组,取决于它的第二个参数 MYSQL_BOTH MYSQL_NUM MYSQL_ASSOC 默认为MYSQL_BOTH
$sql =”select * from table1”;
$result = mysql_query($sql);
mysql_fetch_array($result, MYSQL_NUM);

49. 请说出目前学过的返回是资源的函数?
mysql_connect
mysql_query



53. header()函数主要的功能有哪些?使用过程中注意什么?
1、设置字符编码,设置浏览器输出信息格式(html、image)
2、页面重定向(即可,时间等候)
需要注意:header函数之前不能有任何输出


66. 什么是OOP?什么是类和对象?什么是类属性?
OOP(object oriented programming),即面向对象编程,其中两个最重要的概念就是类和对象。
世间万物都具有自身的属性和方法,通过这些属性和方法可以区分出不同的物质。
属性和方法的集合就形成了类,类是面向对象编程的核心和基础,
通过类就将零散的用于实现某个功能的代码有效地管理起来了。

类只是具备了某些功能和属性的抽象模型,而实际应用中需要一个一个实体,也就是需要对类进行实例化,
类在实例化之后就是对象。

OOP具有三大特点:1. 封装性;2. 继承性; 3. 多态性。


67. 常用的属性的访问修饰符有哪些?分别代表什么含义?
private,protected,public。如果不使用这三个关键词,也可以使用var关键字。但是var不可以跟权限修饰词一起使用。


68. $this和self、parent这三个关键词分别代表什么?在哪些场合下使用?


69.类中如何定义常量、如何类中调用常量、如何在类外调用常量。
类中的常量也就是成员常量,常量就是不会改变的量,是一个恒值。
定义常量使用关键字const.
例如:const PI = 3.1415326;
无论是类内还是类外,常量的访问和变量是不一样的,常量不需要实例化对象,
访问常量的格式都是类名加作用域操作符号(双冒号)来调用。
即:类名 :: 类常量名;


70. 作用域操作符::如何使用?都在哪些场合下使用?

调用静态的属性和方法时候要使用
调用常量的时候要使用

71. 什么是魔术方法?常用的魔术方法有哪几个?
__set()
__get()
__call()
__autoload()
clone

72. 什么是构造方法和析构方法?
构造方法就是在实例化一个对象的同时自动执行的成员方法,作用就是初始化对象。
php5之前,一个跟类名完全相同的方法是构造方法,php5之后魔术方法__construct()就是构造方法。
如果类中没有定义构造方法,那么php会自动生成一个,这个自动生成的构造方法没有任何参数,
没有任何操作。
构造方法的格式如下:
function __construct(){}
或者:function 类名(){}
构造方法可以没有参数,也可以有多个参数。

析构方法的作用和构造方法正好相反,是对象被销毁时被自动调用的,作用是释放内存。
析构方法的定义方法为:__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()方法的意义更多在于调试,可以定位到错误。同时可以捕捉异常,如果某个方法不存在,
则执行其它可替代方法。



82. final关键字能定义类中的成员属性吗?

83. final关键字定义的类能够被继承吗?

84. 说说static关键字的使用场合?static能用在class前吗?static可以跟public,protected,private一起使用吗?构造方法可以是static的吗?

85. 接口可以实例化吗?抽象类能实例化吗?

86. class前面能加访问修饰符吗?如果能加,只能是哪几个访问修饰符?可以是权限访问修饰符public,protected,private吗?

87. 类中属性前可以不加访问修饰符吗?成员变量前的修饰符只能是public,protected,private吗?还可以是哪几个?

88. 如果echo一个数组,页面输出什么?echo一个对象呢?print一个数组或者对象呢?

89. __tostring()魔术方法在什么时候被自动执行? __tostring()魔术方法必须要return返回值吗?

90. 什么是抽象方法?

91. 如果一个类中有一个方法是抽象方法,而这个类没有定义成抽象类,会报错吗?

92. 如果一个类是抽象类,而类中的方法都是非抽象的方法,会报错吗?

93. __get() __set() 自动触发时机?
1)当在类外部访问一个没有访问权限的属性时;
2)当在类外部来访问一个类中不存在的属性时候,也会自动的触发。


94. final 关键字的应用应注意的问题?
使用final关键字定义的类,禁止继承。
使用final关键字定义的方法,禁止重写。

95. 如果一个类既要继承一个父类,又要实现多个接口,该如何写?
书写格式例如: class MaleHuman extends Human implements Animal,Life { ... }




99. 不常用魔术方法的触发时机?
__isset() __unset()的触发时机

__sleep()、 __wakeup() 在对对象进行串行化的时候调用
如果序列化对象的时候,不写__sleep()方法,则所有的成员属性都会被序列化,而定义了__sleep()方法,则只序列化指定数组中的变量。
因此,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。

使用 __sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
使用 __wakeup 的目的是重建在序

列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
__tostring() 当直接 输出对象的时候,会自动调用该方法。


100. OOP的三大特性是什么?
1. 封装性:
也称为信息隐藏,就是将一个类的使用和实现分开,只保留部分接口和方法与外部联系,或者说只公开了一些供开发人员使用的方法。
于是开发人员只需要关注这个类如何使用,而不用去关心其具体的实现过程,这样就能实现MVC分工合作,也能有效避免程序间相互依赖,
实现代码模块间松藕合。

2. 继承性:
就是子类自动继承其父级类中的属性和方法,并可以可以添加新的属性和方法或者对部分属性和方法进行重写。继承增加了代码的可重用性。
php只支持单继承,也就是说一个子类只能有一个父类。

3. 多态性:
子类继承了来自父级类中的属性和方法,并对其中部分方法进行重写。
于是多个子类中虽然都具有同一个方法,但是这些子类实例化的对象调用这些相同的方法后却可以获得完全不同的结果,这种技术就是多态性。
多态性增强了软件的灵活性。

相关主题