php的基础语法[3]

条件结构

这里的话,熟悉其他语言的自然很熟悉了,
这里先从if开始吧,用法如下:

if(条件) {
	...
}

当条件成立时,就执行括号内的语句。

这里做几个测试:

  1. 1大于0成立时输出Yes
if(1 > 0) {
	echo 'Yes';
}

条件由逻辑运算符构成,当运算结果为true时执行括号中代码。

  1. 声明个文本变量,然后作为条件进行执行,如果条件成立,输出text
$s = "1a2b";
if($s) {
	echo 'text';
}

条件可以是任意数据类型,会被转换成逻辑值再进行判断,
整数变量判断是否为0,如果为0,则转换为false,即条件不成立;
对于文本变量,则会先判断是否能转为整数,能就按整数判断;不能就判断文本长度,当长度大于0时转换为true,即条件成立。

  1. 声明两个变量ab,当a0b不为0时输出pass
$a = 9;
$b = 0;
if(!$a && $b) 
	echo 'pass';

条件可以是多个条件,使用逻辑运算符分开。

条件可以为多行代码,但一定要补上逻辑运算符(&&||)
括号跟在条件的括号后面,也可以另起一行。
在括号里的执行语句只有一句时,可以省略括号。


既然有条件成立时执行的代码,那一定也有不成立时执行的代码,也就是else

else要配合if使用,else后面不能加任何条件语句,同样可以根据情况省略括号,else也可以省略

继续拿if的例子来说:

如果a1b0,则输出pass,否则输出error

$a = 99;
$b = 1;
if($a === 1 && $b === 0) {
	echo 'pass';
} else {
	echo 'error'; 
}

暂时没想到这里有什么骚操作,就这样吧。


有时候,我们想要实现这样的一个效果,(还是拿上面的例子接着玩,但加强下?):

现在有三个变量abc
如果a等于b+c,则输出pass
否则,如果bc的两倍,也输出pass
再不济,如果c大于0,还输出pass
不然就输出error

如果我们单纯的用if-else,那很有可能输出三个pass,所以这里改用elseif
elseifif分支下使用,但在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分开就行,我大概是闲的蛋疼,为了说明这个例子这么写。
如果把每个条件成立时的执行语句改改,就不会这么尴尬了

=-=,反正,elseelseif都是可以省略的,后面只有一句执行代码时可以省略括号,然后好像没什么坑了。


选择结构

switch语句,可以根据不同条件执行不同代码。

它的语法和if有点像,但又有区别,先来看个简单的调用例子:

$x = 1;
switch($x) {
	case 1:
		echo '$x = 1';
		break;
		
	case 2:
		echo '$x = 2';
		break;
	
	default:
		echo '$x = ' . $x;
}

首先看到的是第2行,这里的$x即条件,同样可以为任意数据类型。
然后跟个不可省略的大括号,在里面写代码。

接下来,会看到代码里有三个新的关键词:casebreakdefault

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的这些特点,所以才说switchif有相似之处。


循环语句

这里就不介绍了,详见之前直接开坑所写的两篇:


自定义函数

为了把代码过程抽象化,避开重复劳动 (虽然可能是复制粘贴) ,我们用函数完成这一过程。

首先,使用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分别是02

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值