一、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 是外部
var是外部var的同名引用或者指针;
示例
$var1 = 1;
function test(){
unset($GLOBALS['var1']);
}
test();
echo $var1;
输出为空
$var1 == 1;
function test(){
global $var1;
unset($var1);
}
test();
echo $var1;
输出为1,unset()只是删除$var1的引用或者指针,并不会真的删除这个本身的值
四 静态变量
在函数调用时保存上次局部变量执行的结果,以便下次执行时使用;
function staticMethod(){
$a = 0;
return ++$a;
}
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
echo staticMethod().PHP_EOL;
输出内容都为1;
function 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,2,3,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 解析 test变量;HereDoc解析test变量;
八、return和exit
return函数是专门用在函数体和方法里的,在低矮哦用函数和方法时,使用return从函数内存不返回调用处;
exit在代码里进行中断执行;
九、传值和传引用
变量名存储在内存栈中,它是指向堆中具体内存的地址,通过变量名查找堆中的内存。
普通传值:传值以后,是不同的地址名称指向不同的内存实体;
引用传值:传引用之后,是不同的地址名称但都指向同一个内存实体;改变其中一个,另外一个也就被改变;
此题为好未来学而思面试的示例
$a = 1;
$b = &$a;
unset($a); //此时只是断开了$a到内存的连接,但是不会断开$b到内存区域的链接,所以$b还是指向内存的
echo $b;
结果:1
unset并没有真正销毁变量的作用,只是断开了变量到内存之间的连接;内存只要还被引用着就不会被释放;
区别:
传值会很耗时间耗内存,特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作;
传送引用,函数内的任何操作等同于对传送变量的操作,传送大型变量时效率高!