1.Global引用和Globals全局变量
在声明一个局部变量想在别的方法里调用时可以通过global传参的方法来调用变量,比如:
<?php
$name = "niaho";
function () {
global $name;
echo $name;
}
此时的$name变量值才会被输出,因为其为局部变量,在function中并未被定义,直接输出就会报错,global引用后才能被调用输出,不过这样会污染变量。
当然还有另外一种方法,就是全局变量Globals,如果直接
print_r($GLOBALS)
此时输出数组
Array ( [_GET] => Array ( ) [_POST] => Array ( ) [_COOKIE] => Array ( ) [_FILES] => Array ( ) [GLOBALS] => Array *RECURSION* [name] => niaho )
可以看到有被定义的$name值,此时可以直接
<?php
$name = "niaho";
function show() {
global $name;
echo $name;
echo ($GLOBALS['name']);
}
show();
?>
这样就能直接输出GLOBALS中的name值了。
2.static保存值
看如下一段代码:
<?php
function make(){
$num = 1;
$num = $num +1;
return $num.'<hr/>';
}
echo make();
echo make();
echo make();
?>
输出的结果值是222,可以看到num的值并没有累加,一直是保持着赋值为1,然后1+1赋值为2的操作,那么如何进行累加,及保持num的数值不变呢,就要用到static,看代码:
<?php
function make(){
static $num = 1;
$num = $num +1;
return $num.'<hr/>';
}
echo make();
echo make();
echo make();
?>
此时输出结果就为234,static让num的值得以保持并不断累加。
3.三目运算符和双问号
三目运算符
三目运算符可以看作一个if else语句的简写,比如说:
<?php
$var = 1;
echo $var == 1 ? 'yes' : 'no';
?>
该代码块意思就是赋值var变量值为1,如果变量var值等于1,则输出冒号左边第一值yes,否则输出另外右边的值no,转换成if else语句如下:
<?php
$var = 1;
if ($var == 1){
echo 'yes';
}else {
echo 'no';
}
?>
问号前面的表达式相当于if语句中的条件,三目运算符也可以嵌套使用,不过并不推荐。
双问号
??是php7新推出的表达式,
c = a ?? b;
表示如果a非空,则c = a,如果a为空,则 c = b;
双问号会先检测问号左边的值是否为空,为空则直接输出右边值,非空则直接输出左边值。
如果想要知道一个变量是否被定义过,用三目运算符可以这么写“
<?php
echo isset($name)?'yes':'no';
?>
因为没有定义过$name的值,因此输出为no,如果用双问号的话就是这么写:
<?php
/* echo isset($name)?'yes':'no'; */
echo $name??'no';
?>
双问号先检测了 n a m e 的 值 是 否 未 定 义 , 检 测 到 未 定 义 , 就 直 接 输 出 了 n o , 如 果 name的值是否未定义,检测到未定义,就直接输出了no,如果 name的值是否未定义,检测到未定义,就直接输出了no,如果name定义了,则就会输出$name。
4.PHP中的流程替代语法
流程控制(包括if,while,forforeach,switch)这几个语句有替代语法,替代语法的基本形式是左花括号({)换成冒号(:),把右花括号(})分别换成 endif;,endwhile;,endfor;,endforeach; 以及 endswitch; ,上代码说明:
if ( ) {
}
常规的这样的流程控制语句可以替代成这样:
if ( ) :
endif;
使用替代语法的好处就是:
1.使HTML和PHP混合页面代码更加干净整齐。
2.流程控制逻辑更清晰,代码更容易阅读,极大增强了代码的可读性。
5.break跳出循环语句
直接看代码:
<?php
$name = 0;
while (true):
$num++;
switch ($num) {
case $num % 2 == 0:
echo $num . "<hr />";
break;
case $num % 15 == 0:
echo $num . "<hr />";
break 2;
}
endwhile;
?>
以上的代码有两个循环,第一层的while语句循环,第二层的是switch语句的循环,当num值被2整除时输出,当num值被15整除时输出,不过当num值能被15整除时break 2意思就是打破while的循环,输出的数就是2 4 6 8 10 12 14 15。
6.引入文件include和require
include
include可以引入别的模板文件,示例101.php如下:
<?php
include '102.php';
?>
而被它引入的模板102.php则代码如下:
<h1>hello!</h1>
include相当于把模板里代码引入过来粘贴在include的位置,在Include前面定义的变量在模板中也是通用的,比如说:
101.php:
<?php
$num = 1;
include '102.html';
?>
102.html:
<h1>
hello!
-
<?php echo $num; ?>
</h1>
此时输出的就为 hello! - 1 ,如果没有找到include的模板文件情况下可能就直接运行include下面代码了,不会直接报错,可以写个if语句来输出一个默认模板防止没有找到include要找的模板文件:
101.php:
<?php
if(!@include '103.html'){
include 'defualt.html';
}
?>
defualt.html:
<h1>hi!</h1>
在找不到模板文件的情况下就直接输出了模板defualt.html文件了,不加@会报错。
require
require在模板文件存在的情况下与include并无太大差别,但是require是强加载,如果模板文件不存在的情况下是会报一个致命错误的,后面代码直接不会运行。