php面试易错大总结一

一、empty, isset,is_null的区别

定义:isset()用来检测一个变量是否已声明且值不为NULL,换句话说,只要变量值不是NULL就返回真值;
empty()用来检测一个变量是否为空。在以下几种情况下返回真值:空字符串,false,空数组,NULL,0,以及被unset删除之后的值;
is_null()函数用来判断变量内容是否是NULL值。也就是只有变量值为NULL时才返回真值。
相同点:都返回布尔值,bool(true)或者bool(false);
不同点:is_null()和isset()函数是反函数;isset()可以应用到未定义的变量,而is_null()只能针对已声明的变量;

具体参考php官网:empty,isset,is_null区别

二、变量作用域
定义
全局变量:在php中定义一个变量,在脚本任意位置都可以存取访问,被称为“全局变量”。
局部变量:定义在函数或类的方法中的变量只可以在函数内部访问;
示例

<?php

$globalName = "老杜";
function getvar(){
    $localName = "Raymonde";
    echo "Hello, $localName".PHP_EOL;
}
getvar();
echo "the value of \$globalName is :'$globalName'</br>";
echo "the value of \$localName is :'$localName'</br>";

输出结果为:
Hello,Raymonde
the value of $globalName is '老杜';
the value of $localName is '';   $localName是一个局部变量,只在getvar方法中有值,所以在外部输出时为空值;

php允许函数内部访问外部的全局变量,只需要在函数内部使用global关键字即可;

$globalName = "老杜";
function getvar(){
    $localName = "Raymonde";
    echo "Hello, $localName".PHP_EOL;
    
    echo "Hello, $globalName";  如果直接调用外部的全局变量,$globalName为空
	
	global $globalName;
	echo "Hello, $globalName";此时输出 Hello,老杜
	或者
	echo "Hello".$GLOBALS['globalName']两种方式都可,下面说他两的区别
}
getvar();

三 global关键字和GLOBAL数组的区别
区别
$GLOBALS[‘var’] 是外部的全局变量本身;
global v a r 是 外 部 var 是外部 varvar的同名引用或者指针;
示例

$var1 = 1;
function test(){
	unset($GLOBALS['var1']);
}
test();
echo $var1;

输出为空

$var1 == 1;
function test(){
	global $var1;
	unset($var1);
}
test();
echo $var1;

输出为1unset()只是删除$var1的引用或者指针,并不会真的删除这个本身的值

四 静态变量
在函数调用时保存上次局部变量执行的结果,以便下次执行时使用;


function staticMethod(){
     $a = 0;   
    return ++$a;
}
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;

输出内容都为1function staticMethod(){
    static $a = 0;   //$a 为普通变量时,输出的值都为1; 当为静态变量时,输出的值为1,2,3,4。静态变量的函数调用时,保存了上次运行的值。
    return ++$a;
}
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;

输出内容 为1,23,4

五 require,require_once,include,include_once的区别
如果在php脚本中扫描到include()或者include_once()语句,包含文件失败,会显示警告错误(Warning Error),然后继续执行;
如果是require()或者require_once()语句,包含文件失败后会抛出致命的错误提示(Fatal Error)并且终止脚本的执行;求严谨的话用这个;require()速度要快于require_once()
六、 =与=的区别
=:赋值
==:判断值;
===:判断值和类型;

$x = 23;
echo ($x == 23);   -->true
echo ($x === 23);  -->true
echo ($x === "23");-->false   $x为int类型,而“23”为字符串类型

七、HereDoc与NowDoc
NowDoc和HereDoc唯一区别就是NowDoc是使用单引号作为定界符;
对包含的文本不做任何解析,直接输出纯文本的东西;

HereDoc:

<?php
$excerpt=1;
$test = "http://baidu.com";
echo<<<excerpt
<p>999999999999999999999999999999$excerpt <br>666666666$test</p>
excerpt;


输出:
<p>9999999999999999999999999999991 <br>666666666http://baidu.com</p>

?>

NowDoc

<?php
$excerpt=1;
$test = "http://baidu.com";
echo<<<'excerpt'
<p>999999999999999999999999999999$excerpt <br>666666666$test/p>
excerpt;
?>
输出:<p>999999999999999999999999999999$excerpt <br>666666666$test/p>

区别:NowDoc 的自定义符号加单引号’ ',且不解析 t e s t 变 量 ; H e r e D o c 解 析 test变量; HereDoc 解析 testHereDoctest变量;

八、return和exit

return函数是专门用在函数体和方法里的,在低矮哦用函数和方法时,使用return从函数内存不返回调用处;
exit在代码里进行中断执行;

九、传值和传引用

变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存。
普通传值:传值以后,是不同的地址名称指向不同的内存实体;
引用传值:传引用之后,是不同的地址名称但都指向同一个内存实体;改变其中一个,另外一个也就被改变;

此题为好未来学而思面试的示例

$a = 1;
$b = &$a;
unset($a);  //此时只是断开了$a到内存的连接,但是不会断开$b到内存区域的链接,所以$b还是指向内存的
echo $b;  

结果:1

unset并没有真正销毁变量的作用,只是断开了变量到内存之间的连接;内存只要还被引用着就不会被释放;

区别:
传值会很耗时间耗内存,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作;
传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值