我们先讲解几个最常用的例子,我们将下面的表单命名为user.html:
上现是很基础的一段HTML代码,在这段代码的主要意思是把用户和密码,采用get方法,将数据发送给reg.php(在上面代码的第6行规定的)。reg.php想办法接收用户传过来的username和pwd这两个值。
我们得出我们的第一个外部变量:$_GET。
$_GET 的主要作用是将得到get传值的数据。
我们写一个reg.php,用$_GET来接收值试试:
的值
$u = $_GET['username'];
echo $u.'
';
//$_GET['pwd'] 得到表单 的值
$passwd = $_GET['pwd'];
echo $passwd.'
';
?>
根据上图,观察特点:
reg.php后面跟了一个?(问号)
表单里面的username变在了地址栏里面
表单面username的值输入的是root,在username后面跟了个=(等号)输入的值
username(名字)=Linuxprobe(值) 后面的密码是password(名字)=Linuxprobe(值),中间有&(and符)分开
密码是可见的,那怎么样保证安全呢。让我在注册的过程当中,密码不在地址栏里面被人看到呢?
这个时候我们需要使用到post传值,post传值是在地址栏中不可见的。
同样上面例子的代码我们进行修改,html代码如下:
PHP的代码里面的$_GET全改为了$_POST:
的值
$u = $_POST['username'];
echo $u.'
';
//$_POST['pwd'] 得到表单 的值
$passwd = $_POST['pwd'];
echo $passwd.'
';
?>
观察特点:
index.php后的?(问号)不见了。后面的username和password也不见了。那他怎么传递数据的呢?
他是通过我们看不见的浏览器的请求头文件传递的数据。所以在URL(网址)栏不可见。
注:附录中有如何通过火狐浏览器的firebug查看传递结果的演示过程。这一块都是HTTP协议规定的传送方式。
除此之外,我们还有$_REQUEST来接收数据。现在我们这样处理:
将php代码段中的$_POST全改为$_REQUEST,代码如下:
';
$passwd = $_REQUEST['pwd'];
echo $passwd.'
';
?>
把网页user.html里面的这一行中的method,改为get执行一次,再改为Post再运行一次,看看结果:
通过上面的实验你会发现$_REQUEST即可以接收get传值也可以接收post传值。
另外,我们总结一些外部变量,要求知识点的学习级别:了解含义,默写这个单词的写法和作用。
请再记一句话:以上这些变量全是超全局的。(以后讲解超全局的含义)。
注:
1.我们认为从用户输入过来的所有数据都不是可信的。本书的下半部份会专门讲解限制和过滤
2.在提交数据的时候,我们常用的方法有get和post。可以这样理解,get传值在url中可见,而post传值在url中不可见。
而post传值在url中不可见,是通过浏览器的header头部份将数据发送给指定服务器的。需要通过专门的工具才能看到Post发送的值为什么。你可以下载火狐浏览器(firefox)的插件(firebug)来查看。
若真是使用get传密码,密码在地址栏里面显示过后。浏览器的历史记录会自动记录访问过的地址。恶意用户会,可以通过查看你的浏览器的历史记录,得到你曾经输入的密码。因此,不能使用get方式来作密码的传输方式。
二、PHP常量和变量之环境变量
环境变量我们主要用的有$_SERVER和$_ENV两个环境变量。
不过,$_ENV逐渐被PHP的新版本给废弃了。
【重点】知道在哪儿查看环境变量的名字(key)和值(value),记住并默写几个常用的环境变量。
查看环境变量,我们在学习PHP的第一天就学习过:
其实环境变量不是不用背的,我了解在哪儿能够找到环境变量的key(键)和值即可。
你在执行phpinfo();的这个网址中,将网页向下拉动翻页,看看能不能找到截图中的部份:
_SERVER['中间的值'],是需要我们了解意思的。
如果我们需要显示我们当前访问的这个phpinfo();页面文件放在哪儿,就可以执行:
我们来了解一些常用的环境变量的键名和值对应的意思:
URI 和URL都是网址,但是URL带有了主机地址部份,而URI不带主机地址部份,例如:
http://www.php.cn/abc.php?username=php 上面是一个URL(统一资源定位符),而URI是不带主机和(http://)
三、php常量和变量之变量引用
变量引用
变量引用很多老师喜欢来用C语言的指针来去讲解。我们作为有这么多年开发和教学经验的人来说——大多数学习PHP的人来说根本不了解C语言。
使用C语言一指针来讲解变量引用,我们觉得画蛇填足。并且,不利于没有C语基础的朋友们学习。
关于变量引用的知识点,请以我们的讲解为理解的基准!
我们来对比两段代码的执行结果:
第一段代码,没有任何区别。跟我们原有的PHP代码一模一样:
';
//$fo的结果为5
echo $fo.'
';
?>
第二段代码:
';
//$fo的结果为6
echo $fo.'
';
?>
为什么两个结果都变成6了呢?
我经常跟大家这样来举例。我们可以这样来想象:一个变量名,对应了一个数据值。如下图:
而加上&(and 符后),把变量指向同一个存值空间了,如下图:
也就是不论$fo或$bar的值如何发生变化,$fo变$bar也变,$bar发生变化,$fo也会发生变化。
举个不靠谱的例子,方便你来理解:
你家有只小狗,叫作旺财。又有一只小狗叫作狗蛋。有一天,你把狗蛋给吃了。把狗蛋这个名字给了旺财
那么,你不论是打狗蛋一下,还是打旺财一下都是打的同一条狗。
四、php基础语法之算术运算
算数运算符,就是大家小学所学绝大多数知识:
与我们数学所学一样,也有优先级:先乘除,后加减。如果你想更明确的改变优先级,那就用()【小括号】,将想要优先的值给括起来。
五、php基础语法之赋值运算
赋值运算
赋值运算,我们已经学过了。
我们在数学里面把 = (一个等号)叫作赋值运算符,即:把等号右边的值,赋值给等号左边的变量,左边的变量就为右边的值。
代码是从上到下运行的,因此赋值就可以从上至下的反复赋值:
上例中x被反复赋值为不同的类型的值了。上面我们已经学习过了很多次了。
那么PHP的赋值运算符还有几个:
上面的例子和等价式都有明确的说明。
$x += $y 等价于 $x = $x + $y
以上的全部记住即可。都是一些语法上的规定,没什么好说的。
六、php基础语法之自加自减
自加、自减运算
自加自减,就是把自己加1,或者减1。
如果你学习过其他编程语言。你会发现,此处的用法又是计算机里面的一个规定。可以这样用,用起来更加简洁。
上面的用法其实挺简单的,按照上面的例子。我们分成步骤去,按过程去判断即可。
我们来对比一下先加后赋值,如下:
你再做实验,试试$x-- 和 --$x的结果是这样吗?
请回答,下面$water + $paper的结果为多少?
七、php基础语法之比较运算符
比较运算符,在大家小学的时候就学了很多,有:
不过在在我们PHP里面多出了一种运算符:
我们来回顾一下小学时候学的知识:
x = 5
y = 6
x
我们小学的时候就学过类似于这样的判断题。
而电脑里面的对错,就是bool(布尔)数据类型的真(true)和假(false)。
那,我们是不是可以用之前所学的if...else来判断类型呢?
$y){
//真区间
echo '变量x 大于 变量y,成立';
}else{
//假区间
echo '变量x 大于 变量y,不成立';
}
?>
我想,如果小学毕业的你。小于、小于等于、大小等于、不等于都会做实验了,请你实验几次。并且,完全能够默写!
接下来的一个重点是演示,等于(==)和全等于也叫判断类型等于(===)。
我们来写一段代码,大家看看两段代码就是符号PHP学院,为什么结果有这么大的差距呢?
下面这段代码执行出来的结果,运行了真区间。
下面这段代码执行出来的结果,运行了假区间。
我们对比区别发现:
下面这段代码是===(三个等号,我们说他还有一个名字是判断类型等于)。而$x为整型的5.$y为字符串类型的5.类型PHP学院,所以执行的是假区间。而上面一段代码,是两个等号不判断类型,所以执行的是真区间。
八、php基础语法之逻辑运算
逻辑运算符比较简单,是我们人类进行逻辑思考时的一种方式。
讲出很多吊丝男士的心愿:某一个女人,要不长得漂亮、要不比我有钱我就娶她。如果一个条件都没有,那就算了。
上面的这种不评价好坏的心理状态,只是来说明这就是典型的计算机思维。
美丽这个条件成立(true) 或者 财富这个条件成立(true),则执行娶她的行为和动作。否则,就不娶这个女孩。
那我们把这些逻辑关于进行了归纳和总结,下面表格中的:$x为条件一,$y 为条件二。进行说明:
逻辑与,中文解释为并且。可理解为,$x 并且 $y 都为真(true)的时候执行。
逻辑或,中文解释为或者。可以理解为,$x或者$y其中一个为真(true)的时候执行。
逻辑非,中文解释取反。如果$x的执为假(false),进行一次非操作。非假(false)就为真了,就可以执行真区间了。反推true,则执行假区间了。
逻辑异或,如果$x和$y相同则为false,不相同则为true。
那我们来举几个例子来试试,你自己也要记得多做几次实验。
逻辑与:
逻辑或:
逻辑非:
【重点知识】短路
短路就是采用一个懒人模式来思考问题。
逻辑与的特性是:两边为true即为true,其他情况均为假。
逻辑或的特性是:两边为假均为假,其他情况全为真。
我们现在把自己想象成一个懒汉,非常非常懒。来思考逻辑与和逻辑或。可不可以这样理解:
逻辑与:如果前面第一个条件为false了,后面就可以不用执行了。
用代码表示:if($x && $y) 如果$x已经为false了,后面的$y 就没有执行必要了。
逻辑或:前面第一个条件为true了,后面就不用执行了。
用代码表示:if($x || $y) 如果$x已经为true了,后面的$y 就没有执行必要了。
我们写段代码来证明一下:
代码如下,将两个&符改为一个&符试试:
我们来看看短路的逻辑或:
改成一个 | 再看看执行结果
通过上例我们知道了&&与&的区别,||和 |的区别。我们也了解了什么是短路。那我们在什么地方可以用到短路呢?有一些奇怪的写法,我们必须了清楚。其实就是基础语法的再应用。
上面的一段代码就是典型的短路应用的代码
exit 的意思是指在此处停止运行,退出。后面的PHP代码不再执行了。它有两种用法:
1,直接exit; 就是直接退出
2,exit(‘提示内容’),退出的时候还给出一段提示内容
九、PHP基础语法之 位运算
以上的符号,均为二进制的运算。
二进制大家绝大多数情况下不会遇到,遇到了补一下二进制这一块的知识就会了。
异或解释:如果x,y两个值不相同,则异或结果为1。如果x,y两个值相同,异或结果为0。
由此可推1101为$x和$y异或出来的结果,1101用二进制转10进制工具转换后的结果就为13。
十、PHP基础语法之 三元运算符和其它运算符
三元运算符和其它运算符
此外还有一些特殊的运算符和符号,我们再来进行讲解。可能以后我们需要用到。
三元运算符,相当于是if...else结构。不过三元运算符的写法更加简洁,语法格式如下:
$x? 真代码段(只能写一句代码):假代码段(只能写一句代码);
代码如下:
反引号就更加特殊了,我们经常需要显示IP地址,在PHP里面可不可能显示我们windows的IP地址呢?用反引号,就可以执行我们的命令(不过有些虚拟服务器是禁止执行这些的命令脚本的):
';
echo `ipconfig`;
echo '
';
?>
上面的代码你执行看看效果,是不是显示出来了你机器的IP地址和一堆和IP相关的参数?
@符是指单行抑制错误,以后的章节我们还会讲解到。此处为了解级别。
数组下标访问符,以后也会有一章讲解,此处了解一下就可以了:
'新浪' ,'sohu' => '搜狐');
echo $data;
?>
对象访问符->和instanceof 都是了解级别,以后也有专门的章节进行讲解:
username = 'PHP中文网';
echo $obj -> username;
?>
上面的所有例子中,除了三元运算符、@符、反引号外。其他的学习级别均为了解,在以后讲解的时候。知道有这个符号即可。
十一、PHP流程控制之if语句
我们配合之前的知识点来写一个计算器:
十二、PHP流程控制之嵌套if...else...elseif结构
还记得本章开篇我们讲了一个王思总同学的例子:
王同学是生活极度充满娱乐化和享受生活的人。他抵达北京或者大连的时候做的事,他抵达后做的事情,如下:
半夜到达,先去夜店参加假面舞会
早上抵达,爱在酒店泡个澡
中午到达,会吃上一份神户牛肉
晚上到达,总爱去找朋友去述说一下心中的寂寞
我们来了解一下他的语法规则【知识点要求:默写】
我们可以把王思总同学的例子通过PHP代码表示出来,代码表示结果如下:
6 && $dida < 10){
echo '我爱泡澡';
}else if($dida >10 && $dida < 14){
echo '吃神户牛肉';
}else if($dida >=19 && $dida < 22){
echo '找一个朋友聊聊内心的寂寞';
}elseif($dida > 22 && $dida <= 23){
echo '泡澡';
}elseif($dida >= 1 && $dida <3){
echo '泡澡';
}else{
echo '睡觉或者工作';
}
?>
王思总同学我们在最开始的故事中讲到了他有两个秘书:一个生活秘书、一个工作秘书。
王思总同学在出行和项目中也是极度有计划性。他给自己的生活秘书和工作秘书分别指派了出差的行程:
生活上:
先查天气,下雨带雨具和毛巾。不下雨要带防晒霜
雨具、毛巾和防晒霜的情况要提前检查,如果没有要及时买
工作上:
要提前沟通去大连前的工作计划,准备好了要及时检查,检查合格,打印签单。
没有及时准备好的情况下,要列出主要的项目沟通议题。
类似于上面的这种情况判断,我们就需要用到if...elseif...else反复嵌套的结构了。
在if语句中可以嵌套一个或多个if语句,以实现对多个参数的判断,这就是if语句的多种嵌套。其结构形式如下:
注意:
我们把王思总同学的生活要求,我们可以用代码用嵌套结构表示出来。我们使用到了三层嵌套结构,代码如下:
用代码模拟随机产生当前的工作是生活秘书的还是工作秘书的
$mishu = rand(0,1);
if($mishu){
//下雨和不下雨的状态,随机产生
//下雨状态为1
//不下雨状态为0
$xiyu = rand(0,1);
if($xiyu){
//是否购买雨伞
$you = rand(0,1);
if($you){
echo '下雨天,已购买不用买雨伞';
}else{
echo '下雨天,未购买,需要买雨伞';
}
}else{
//是否购买防晒霜
$you = rand(0,1);
if($you){
echo '没下雨,有防晒霜';
}else{
echo '没下雨,需要准备防晒霜';
}
}
}else{
//是否准备好了会议议程
$shifou = rand(0,1);
if($shifou){
echo '已准备好,可以随时出发';
}else{
echo '没有准备好,需要打印,延迟出发';
}
}
十三、PHP流程控制之分支结构switch语句的使用
分支结构switch语句的使用
还记得我们最开始讲了这么一个故事:
王同学家里头特别有钱,所以他的行程方式和正常人的又有些不一样。
他的出行方式呢有6种,如下:
1,司机开车
2,民航
3,自己家的专机
4,火车动车
5,骑马
6,游轮
他的方式有6种,而骰子也真好有6面。所以,我们用if...elseif...的判断方式可以实现,但是效率太低了。
还有其他更好的方式吗?我们可以使用到一种方式就是:switch...case语法。
switch...case的语法结构如下:
switch后放需要判断的变量,而case后是放结果。switch后变值为多少,case的值写的与switch变量执相同段的代码。
switch里面在变量最好是 整型,字符串,因为布尔判断更适合if...else..
上节课中我们用到了rand函数,那我们现在来用rand实现王思总同学的问题选择:
上面的代码我们只需要简单修改,就可以实现我们在微信上面玩的一个小游戏简单的家务骰子和剪刀石头布。你想想?
你再做做实验:
我们可以把 case 1 代码段中的break去掉,你再试试,什么效果?
我们再来写一个简单的星期判断,写法也可以变的怪一些哟:
';
};
?>
自己做实验试试:
上面的例子发现,不匹配的时候就执行了defaultk吧?
当然你也可以这样,不过这种写太太累了,没有if...else更加简单。我们不用swith...case来做true和false判断
世界上最痴心的等待就是我是case你是switch, 我一直默默的等待,可是你却不选我!
十四、php流程控制 之循环语句的使用
循环语句的使用
王同学需要反复往返于北京和大连,就是典型的循环结构。假设王思总投资这个项目需要往返大连100次,每次往返都王同学都会计数一次。难道我们写一百遍同样的代码?显然对于智商极高的程序员来说不可能这样处理。
我们抽象了人类的这种思维。我们定义一种循环结构
';
//每次执行让$count+1,这样的话,就不会产生$count永远小于100的情况了
$count++;
//循环结束
}
echo '后续代码';
?>
十五、while循环
在循环的开章,我们讲到了循环的逻辑和语法,通过以上的训练。你能轻易的掌握循环的知识点。
while是一个布尔型循环,while(布尔判断)的值为true就执行大括号括起来的代码。如果为假就停出去,执行后续代码。
现在,我们增加一点难道,来做隔行变色。隔行变色,是我们在网页中经常使用到的表现。
要求重点掌握。我们来看看效果:
';
while($i<100){
//0 - 9 为一行
//10 -19 为一行
//因此,每一行都能够被10求默,如为为10的时候,应该显示行开始的标签
if($i%10 == 0){
//为了隔行变色,每20,40,60每行的颜色是不同的,因此我们又可以再进行一次取余运算
if($i%20==0){
echo '';
}else{
echo ' ';
}
}
echo ''.$i.' ';
$i++;
//同理,每一行结束是不是应该有一个 结束标签呢?
if($i%10==0){
echo '';
}
}
echo '';
?>
那我们现在要写一个0-99的隔行变色的表格该怎么写呢?【要求默写】
定义初始值,输出表格标签 和 表格中的列标签
';
while($i<100){
//输出列0-99的列了
echo ''.$i.' ';
//一定要加哟,不然死循环了
$i++;
}
echo '';
?>
加上行产生的逻辑
';
while($i<100){
//0 - 9 为一行
//10 -19 为一行
//因此,每一行都能够被10求默,如为为10的时候,应该显示行开始的标签
if($i%10 == 0){
//为了隔行变色,每20,40,60每行的颜色不同的,因此我们又可以再进行一次取余运算
if($i%20==0){
echo '';
}else{
echo ' ';
}
}
echo ''.$i.' ';
$i++;
//同理,每一行结束是不是应该有一个 结束标签呢?
if($i%10==0){
echo '';
}
}
echo '';
?>
以上代码需要多练习,不断的实验才能想象出来。上面的部分,需要默写来锻炼逻辑。
可不可以循环里面再嵌套一次循环(双层循环),来实现隔行变色的表格效果呢?【要求默写】
基本实现逻辑如下:
1.先输出表格标签
2.通过第一层循环再输出行标签
3.在第一层循环里面再插入一层循环输出标签
';
$i=0;
while($i<10){
echo '';
$j=0;
while($j<10){
echo ''.$j.' ';
$j++;
}
echo ' ';
$i++;
}
echo '';
?>
上面的代码,你自己加上隔行变色的判断和正常的0-99的数值显示哟?
你可以学完循环后,再学习一些基本的算法。
这样帮助你面试的成功率更高。
注:不要写死循环(没有退出条件的循环)
whie(1){
echo 1111.'
';
}