[PHP]php基础练习题学习随笔
1、解释一下PHP中常量、变量、可变变量并举例说明;超级全局变量有哪些?
- 常量是单个值的标识符(名称),通过define()设置,在脚本中无法改变该值,常量自动全局。
<?php #对大小写不敏感为true,默认为false define("GREETING", "Welcome to W3School.com.cn!", true); echo greeting; ?>
- 变量是存储信息的容器,以$符号开头,首次赋值时被创建,变量名对大小写敏感;
<?php $txt="Hello world!"; $x=5; $y=10.5; ?>
变量的三种作用域:
-
- local
- global (要在函数内部访问需在变量前使用global关键词声明,或使用$GLOBALS[index]数组直接调用)
- static (函数结束时不删除该局部变量并保留最后一次调用后的值)
-
可变变量:用一个变量的值作为另一个变量的名称 (http://www.php.net/manual/zh/language.variables.variable.php)
<?php $a = "hello"; $$a = "world!"; echo "$a $$a"; //或者${$a} echo "$a $hello"; ?>
-
超全局变量:在一个脚本的全部作用域中始终可用的内置变量
- $GLOBALS
- $_SERVER
- $_REQUEST
- $_POST
- $_GET
- $_FILES
- $_ENV
- $_COOKIE
- $_SESSION
2、字符串连接操作符、三元操作符、错误抑制操作符、执行操作符、类型操作符是什么,举例说明用法
- 字符串连接操作符 "." 和 ".="
<?php $a = "Hello"; $b = $a . " world!"; echo $b; // 输出 Hello world! $x="Hello"; $x .= " world!"; echo $x; // 输出 Hello world! ?>
- 三元操作符 " ? : "
$c=($a>$b)?$a:$b
- 错误抑制操作符"@" :屏蔽错误输出。 (博文:《深入理解PHP原理之错误抑制与内嵌HTML》)
$a = @(50/0);
- 执行操作符"` `" : 实现服务器命令行指令。
$out = `ls -l`;
- 类型操作符"instanceof" :检查三件事情:实例是否某个特定的类型,实例是否从某个特定的类型继承,实例或者他的任何祖先类是否实现了特定的接口。
$manager = new Employee(); … if ($manager instanceof Employee) echo "Yes";
3、”===“是什么?试举一个”==“是真但”===“是假的例子。
$x === $y 的意思是如果 $x 等于 $y,且它们类型相同,则返回 true。
$x=100; $y="100"; var_dump($x == $y); // 因为值相等,返回 true var_dump($x === $y); // 因为类型不相等,返回 false
4、解释一下isset()、unset()、empty()
- isset():判断变量是否已存在(配置)
- unset() :把变量删除(释放)掉
- empty() :判断变量是否为空
- is_null() :判断变量是否为NULL
5、PHP的面向对象的特点?什么是接口?implements和extend的区别? (PHP 面向对象教程)
class Person { //下面是人的成员属性 var $name; //人的名字 var $sex; //人的性别 var $age; //人的年龄 //下面是人的成员方法 function say() //这个人可以说话的方法 { echo"这个人在说话"; } function run() //这个人可以走路的方法 { echo"这个人在走路"; } } $p1=new Person(); $p2=new Person();
要实现一个接口,使用 implements 操作符。类中必须实现接口中定义的所有方法,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔多个接口的名称。
6、foo()和@foo()之间有什么区别?
@foo()可以屏蔽错误输出。
- include():包含没有文件时会报错,产生警告,但程序继续运行;
- require():包含没有文件时会报错,导致致命错误,程序停止运行;
- include_once()和require_once()用法同上。但是它们都会首先检查所要包含的文件是否已载入,如果已经载入了则不会重复载入。
8、PHP5中魔术方法函数有哪几个,举例说明各自用法 (15个魔术方法的总结 )
- __autoload() 类文件自动加载函数
- __construct() 构造函数、__destruct() 析构函数
- __call() 当所调用的成员方法不存在(或者没有权限)时调用,用于对错误后做一些操作或者提示信息
- __clone() 该函数在对象克隆时自动调用,其作用是对克隆的副本做一些初始化操作
- __get() 当所对象所调用的成员属性未声明或者级别为private或者protected等时,我们可以在这个函数里进行自己的一些操作
- __set() 当所对未声明或者级别为private或者protected等进行赋值时调用此函数,我们可以在这个函数里进行自己的一些操作
- __isset() 当对一个未声明或者访问级别受限的成员属性调用isset函数时调用此函数,共用户做一些操作
- __unset() 当对一个未声明或者访问级别受限的成员属性调用unset函数时调用此函数,共用户做一些操作
- __toString() 在将对象引用作为字符串操作时自动调用,返回一个字符串
- __sleep() 是在序列化时自动调用的,序列化这里可以理解成将信息写如文件中更长久保存
- __wakeup() 该魔术方法在反序列化的时候自动调用,为反序列化生成的对象做一些初始化操作
- __set_state() 当调用var_export()时,这个静态方法会被调用(自PHP 5.1.0起有效)。本方法的唯一参数是一个数组,其中包含按array(’property’ => value, …)格式排列的类属性。
- __invoke() 当尝试以调用函数的方式调用一个对象时,__invoke 方法会被自动调用。
- __callStatic() 它的工作方式类似于 __call() 魔术方法,__callStatic() 是为了处理静态方法调用
9、数组的创建方式有哪些?举例说明
- 使用array():$数组名=array(值,.......);
- 使用compact()函数可以将一个或多个变量转换为数组
<?php $firstname = "Peter"; $lastname = "Griffin"; $age = "38"; $result = compact("firstname", "lastname", "age"); print_r($result); ?>
- 使用array_combine()函数将两个数组合并成一个新数组,其中的一个数组是键名,另一个数组的值为键值。
- 使用range()函数创建数组:$number = range(0,5); or 指定步长:$number = range(0,50,10);
- 使用array_fill()函数:用给定的值类填充数组。 array_fill(start,number,value)
10、数组的遍历方式有哪些?举例说明
- 使用for语句循环遍历数组: for ($i= 0;$i< count($arr); $i++)
- 使用foreach语句遍历数组:
foreach($arrays as $value)
foreach($arrays as $key=>$value)
- 联合使用list()、each()和while循环遍历数组。
while(list($key,$val)= each($colors)) //list()用一步操作给一组变量进行赋值,each()返回数组中当前元素的键/值对并向后移动数组指针
11、php关联数组按照键、值正向排序:array('c'=>3, 'a'=>4, 'b'=>2, 'e'=>5)
$arr = array('c'=>3, 'a'=>4, 'b'=>2, 'e'=>5) ksort($arr); //正向按键排序 asort($arr); //正向按值排序 rksort($arr);//反向按键排序 rasort($arr);//反向按值排序
12、对一个含有重复值的数组去重:array('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'a'=>1, 'b'=>3, 'd'=>4)
$arr = array('a'=>1, 'b'=>2, 'c'=>3, 'd'=>4, 'a'=>1, 'b'=>3, 'd'=>4);
$result = array_unique($arr); //只保留重复值的第一个键
13、sort()、asort()和ksort()有什么区别?分别在什么情况下使用?
- sort() 只依据值从小到大排序,键值不参与排序
- asort() 依据值排序,键值参与排序
- ksort() 依据键值排序,值参与排序
14、请说明php中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略
按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
15、如何访问和设置一个类的属性?
$object = new myclass();
$newstr = $object->test;
$object->test = "info";
16、写出php5权限控制修饰符
public private protected
17、列举php数据类型
整型(integer)、浮点型(float)、字符串型(string)和布尔型(Boolean)四种标量类型,数组(array)和对象(object)两种合成类型,空值(null)和资源(resource)两种特殊类型。
18、如何修改SESSION的生存时间
setcookie(session_name(), session_id(), time() + 86400, "/");
or
<?php $life_time = 24*3600; Session_set_cookie_params($life_time); Session_start(); ?>
19、简要说说PHP框架
20、一个网页地址如 http://www.phpres.com/index.html,如何得到内容?
$data = file_get_contents('http://www.phpres.com/index.html') ;
21、简述如何得到当前执行脚本路径,包括所得到参数。
echo "http://".$_SERVER ['HTTP_HOST'].$_SERVER['PHP_SELF'];
22、写出数据类型int char varchar datetime text的意思,varchar和char有什么区别?
int是数字类型,char固定长度字符串,varchar可变长度字符串,datetime日期时间型,text文本字符串
23、如何调试并查看错误日志?
打开调试功能:php.ini 里设置error_reporting = E_ALL以及 display_errors = On,重启 web服务(apache)。
一般来讲,Linux系统下(以Centos为例) Php的错误日志会记录在 /var/log/httpd 下的errror_log 里,可通过tail -n 5 -f error_log查看最近几条错误日志。
24、php与apache(nginx)的关系?php代码是如何执行的?
php 是一种编程语言,Apache是一种站点服务器软件,在Apache的conf配置文件里有LoadModule php5_module modules/libphp5.so的类似语句加载php, Apache 处理请求页面时,发现页面中内嵌的 <?php> ... <?>,就会根据配置调用 php 解释器执行这段 php 代码。
25、echo,print()和print_r()有什么区别?
- echo是PHP语句,无返回值;print和print_r是函数,可以有返回值。
- print() 只能打印出简单类型变量的值(如int,string)
- print_r() 可以打印出复杂类型变量的值(如数组,对象)
26、使用php写一段简单查询,查出所有姓名为”张三“的内容并打印。
$result = mysql_query("SELECT * FROM users WHERE name='张三'"); while($row=mysql_fetch_array($result)) { echo $row['name'].$row['tel'].$row['addr']; echo "<br>"; }
27、请写一个函数验证电子邮件的格式是否正确(要求使用正则)
function checkMail($mailText) { if(ereg("^[0-9a-z][a-z0-9\._-]{1,}@[a-z0-9-]{1,}[a-z0-9]\.[a-z\.]{1,}[a-z]$", $mailText) echo "correct!"; else echo "wrong!"; }
28、不用php内置函数实现数组排序。如:array("d"=>100, "c"=>22, "a"=>22)
<?php $arr=array("d"=>100,"b"=>22,"c"=>22,"a"=>22); $newArr=array(); while ($arr) { $key=null; $value=null; foreach ($arr as $k=>$v) { if($v>$value||($v==$value&&$k>$key)) { $key=$k; $value=$v; } } $newArr[$key]=$value; unset($arr[$key]); } print_r($newArr); ?>