条件结构
这里的话,熟悉其他语言的自然很熟悉了,
这里先从if
开始吧,用法如下:
if(条件) {
...
}
当条件成立时,就执行括号内的语句。
这里做几个测试:
- 当
1大于0
成立时输出Yes
:
if(1 > 0) {
echo 'Yes';
}
条件由逻辑运算符构成,当运算结果为true
时执行括号中代码。
- 声明个文本变量,然后作为条件进行执行,如果条件成立,输出
text
:
$s = "1a2b";
if($s) {
echo 'text';
}
条件可以是任意数据类型,会被转换成逻辑值再进行判断,
整数变量判断是否为0,如果为0,则转换为false
,即条件不成立;
对于文本变量,则会先判断是否能转为整数,能就按整数判断;不能就判断文本长度,当长度大于0
时转换为true
,即条件成立。
- 声明两个变量
a
、b
,当a
为0
、b
不为0
时输出pass
:
$a = 9;
$b = 0;
if(!$a && $b)
echo 'pass';
条件可以是多个条件,使用逻辑运算符分开。
条件可以为多行代码,但一定要补上逻辑运算符(&&
、||
)
括号跟在条件的括号后面,也可以另起一行。
在括号里的执行语句只有一句时,可以省略括号。
既然有条件成立时执行的代码,那一定也有不成立时执行的代码,也就是else
。
else
要配合if
使用,else后面不能加任何条件语句,同样可以根据情况省略括号,else
也可以省略
继续拿if
的例子来说:
如果a
为1
且b
为0
,则输出pass
,否则输出error
:
$a = 99;
$b = 1;
if($a === 1 && $b === 0) {
echo 'pass';
} else {
echo 'error';
}
暂时没想到这里有什么骚操作,就这样吧。
有时候,我们想要实现这样的一个效果,(还是拿上面的例子接着玩,但加强下?):
现在有三个变量
a
、b
、c
,
如果a
等于b+c
,则输出pass
;
否则,如果b
是c
的两倍,也输出pass
;
再不济,如果c
大于0
,还输出pass
;
不然就输出error
。
如果我们单纯的用if
-else
,那很有可能输出三个pass
,所以这里改用elseif
。
elseif
在if
分支下使用,但在else
前面使用,并且可以忽略else
$a = 10;
$b = 8;
$c = 2;
if($a == $b + $c) {
echo 'pass';
} elseif($b == $c * 2) {
echo 'pass';
} elseif($c > 0) {
echo 'pass';
} else {
echo 'error';
}
其实可以看出来,这几个条件只要用个or
分开就行,我大概是闲的蛋疼,为了说明这个例子这么写。
如果把每个条件成立时的执行语句改改,就不会这么尴尬了
=-=,反正,else
和elseif
都是可以省略的,后面只有一句执行代码时可以省略括号,然后好像没什么坑了。
选择结构
即switch
语句,可以根据不同条件执行不同代码。
它的语法和if
有点像,但又有区别,先来看个简单的调用例子:
$x = 1;
switch($x) {
case 1:
echo '$x = 1';
break;
case 2:
echo '$x = 2';
break;
default:
echo '$x = ' . $x;
}
首先看到的是第2行,这里的$x
即条件,同样可以为任意数据类型。
然后跟个不可省略的大括号,在里面写代码。
接下来,会看到代码里有三个新的关键词:case
、break
、default
,
case
后面先加个空格,然后附上条件值。
其实,从本质上来看,用switch
就像在代码里使用了多个if
,
把case
当做==
的话(或===
),看起来就像if($x === case后的值)
,
不同的是,即使条件成立后执行的代码有多行,也可以不使用{}
。
而break
的作用是终止判断条件是否等于其他值,
在条件的执行结果等于设定值时,程序会把下面的代码全部执行,
如果不在下个case
前加break
,那么程序会跳过判断条件是否符合下个case
的值,直接执行下个case
成立的代码,
这样说还是很让人凌乱 (反正我已经爆炸) ,举个小例子:
switch(1) {
case 1:
echo 1;
case 2:
echo 2;
}
这里的选择条件是1
,(先直接把它当变量),就是判断这个1
和下面的哪个case
符合,就是判断和哪个相等。
然后可以清楚的看出它与case 1
符合,那么现在就要执行echo 1;
,
本来我们是期望输出1
后就结束这个选择,但是因为没有break
,程序会继续执行echo 2;
,
而且最坑的是,它会跳过判断case 2:
,即判断1
是否等于2
的这个过程。
概括下就是,无论大括号中有多少
case
,一旦找到符合条件的,就会忽略剩下的所有case
,直接执行剩下的所有代码,直到遇见break
后结束执行。
而default
是在所有case
值都不符合条件的情况下才会被触发,可以把它看做else
,也能省略。
正因为switch
的这些特点,所以才说switch
和if
有相似之处。
循环语句
这里就不介绍了,详见之前直接开坑所写的两篇:
自定义函数
为了把代码过程抽象化,避开重复劳动 (虽然可能是复制粘贴) ,我们用函数完成这一过程。
首先,使用function
这一关键字定义函数,(就像变量名用$
打头作为标识一样),因为是弱类型语言,所以不需要定义返回值类型。
然后加个空格,再跟上要用的函数名,这里的注意点和变量名一样,由大小写字母、下划线和数字组成,并且不能以数字做开头。
然后加个括号,在括号里写上需要的参数,参数名和变量名的定义规则一样,参数类型和数量都不做限制,可以一个都没有;也不需要标注参数类型,但可以给参数指定一个默认值,(即$x = 123
),但最好把这种参数放到最后面。
之后再加个大括号,在里面写上需要执行的代码即可,使用return 值;
将返回值传递给调用方,也可以没有这一句,即这个函数没有返回值。
下面是几个使用例子:
// 构造一个无参函数a
function a() {
...
//如果不需要返回任何数据,可以忽略下一句
return 123;
//如果想提前结束函数,又不返回数据,就使用下一句
return;
}
// 构造有一个参数$x的函数b,并返回$x的两倍
function b($x) {
return $x * 2;
}
// 构造有两个参数$x、$y的函数c,($y的默认值为123),并返回$x + $y的值,
function c($x, $y = 123) {
return $x + $y;
}
不过,函数名其实是不区分大小写的,也就是说,用A()
或a()
是调用同一个函数。
还有一个骚操作是,如果你用一个文本变量存储函数名,就可以把变量当做函数名来调用。
// 这里使用上面声明的函数
$x = 'b';
echo $x(6);
因此,这里会输出12。
然后看一些特殊例子:
function a() {
$x = 0;
}
$x = 233;
a();
echo $x;
直接看的话,会觉得这段代码就是给$x
赋值233
,然后调用a()
,把$x
变为0
,
但实际上,最后输出的$x
还是233
,
因为函数内外的变量是独立的,要解决这个问题,
一个是把外部变量作为参数传入函数,比如把函数声明成a(&$x)
,这里相比普通声明有参函数,区别在于参数前面加了&
,但是调用时还是a($x)
;
另一种是在函数内加一行共享变量的声明语句,具体做法是在变量前加个global
,把上面的代码魔改下:
function a() {
global $x;
$x = 0;
}
$x = 233;
a();
echo $x;
这样输出的$x
就是0
了。
这里补充个无关紧要的点:
函数可以在任意位置声明,不过为了提高代码可读性,我们一般在调用前声明。
接下来是另一个特殊例子:
function a() {
static $x = 0;
echo $x;
$x += 2;
}
//第一次调用
a();
//第二次调用
a();
这里的函数a
的作用应该不难看出,就是输出$x
的值,然后再加2
,
如果抛开static
这个关键字,我们可以直接认为两次输出的$x
都是0
,
但是在加上后,$x
就是个静态变量,通俗来讲,就是这个变量被保留了,每次调用函数时都用的同一个变量,所以每次做出的更改都会一直保留,
所以这时候调用两次a
,输出的$x
分别是0
和2
。