对比C语言学习PHP.docx
《对比C语言学习PHP.docx》由会员分享,可在线阅读,更多相关《对比C语言学习PHP.docx(29页珍藏版)》请在冰豆网上搜索。
对比C语言学习PHP
PHP基础学习部分
目录:
一、PHP介绍
二、数据类型、运算符与表达式
三、最简单的PHP程序设计——顺序程序设计
四、选择结构程序设计
五、循环控制
六、数组的使用
七、函数
八、预处理命令
九、指针
一十、结构体与共用体?
PHP替代的形式
一十一、位运算
一十二、PHP网页交互
a)POSTGET
b)URL
c)表单文件上传
d)Sessions
e)Cookies
f)E-mail
一十三、附录php函数列表(转自w3school)
#输出函数
#正则表达式函数
#数学函数
#时间函数
#字符处理函数
#文件操作函数
#数据库函数
#Session函数
#其他函数
#图像处理函数(GD库内容不在常用函数手册内,请自行查找)
-----------------以下部分需要自己找参考资料学习在此列出方向-------------------
一十四、OOP(专业phper必会)
一十五、错误处理(专业phper必会)
一十六、异常
一十七、过滤器
一十八、DOM(专业phper必会)
一十九、设计模式(专业phper必会)
二十、框架(专业phper必会)
二十一、测试与文档编写(专业高级phper必会)
二十二、SQL(PHP标准库)(专业高级phper必会)
二十三、其他
一、PHP介绍
php、asp、jsp都是网站建设中的核心语言,是完成服务器端数据的验证整理、读取数据库、完成各项任务的程序设计语言。
虽然很不情愿,我不得不承认,它们都是脚本语言。
我们运行这些语言,不需要编译、链接。
我们还可以把这些语言插入到HTML文本中,服务器仍然能正常的解释它们。
在这里,我要讲的是PHP,不去过多的关注asp、jsp。
不过还是附带的提议下,告诉大家我们为什么选择php。
asp是微软公司开发的语言,所以……唉~没什么可解释的,稳定性差、只能运行于windows的IIS服务器平台。
jsp是个不错的语言,实际上它是Java的一部分,全称是Javaserverpage,也可以理解为是拿Java写的网页,效率很高、稳定性很强、兼容性也很好,但是在开发效率方面要比php逊色。
对于jsp我了解的也不是很多,就不在多说了。
php,是免费开源的脚本语言,多平台兼容性很好,开发效率高,稳定性强,语法亚很简介。
其实也是我第一个接触的程序设计语言,所以我很喜欢它。
目前有一种网站解决方案的绝配叫做LAMP,也就是Linux+Apache+Mysql+PHP(其实有3种P,PHP只是其中之一)。
他们都是开源且独立的,但是因为经常放在一起使用,所有之间的或作也越来越方便。
Linux作为一个安全性极佳、性能极强的操作系统,在LAMP中的最基层(你辛苦了!
)。
Apache则处在次基层的位置,提供网页访问的服务,当然他还要去解释PHP(你其实也很辛苦)。
Mysql是数据库软件,当然它的地位相比就没L和A重要了,Oracle也是不错的选择,他们都使用SQL语言。
那么不再废话说什么PHP的人才需求了,大家懂的,下面进入正题。
二、数据类型、运算符与表达式
本章与接下来的几章,我们将类比C语言去学习PHP的基本语法结构。
【数据类型】
同学们在使用C语言的时候,变量的数据类型应该困扰过大家一段时间,而在定义时去考虑使用什么类型的变量,每种类型的取值范围是多少,都是同学们写C程序的时候要考虑的问题。
在PHP中,我们不需要去指定每一个变量的数据类型,而是由PHP在运行过程中自动选择的。
在PHP中,共支持8中数据类型——整形(int)、浮点型(float)、字符串(string)、布尔型(bool)四种基本数据类型,数组(array)、对象(object)两种合成类型,空值(null)、资源(resource)两种特殊类型。
由于变量类型在php中比较松散,而且在需要的时候会自行或强制转换,在此不做过多的介绍。
【常量与变量】
变量:
PHP中的所有变量都是以$符号开始的。
在PHP中设置变量的正确方法是:
”$var_name=value;”PHP的入门者往往会忘记在变量的前面的$符号。
如果那样做的话,变量将是无效的。
让我们试着创建一个存有字符串的变量:
php
$str="HelloWorld!
";//创建一个变量并赋初值
echo$str;//输出变量
?
>
常量:
在php中使用define()函数定义常量。
如:
php
define(“PAI”,3.1415926)//常量的定义;
echoPAR;//常量的使用
?
>
在使用常量时候不可以加入变量符号$。
常量只能是基本数据类型。
常量的作用域相当于全局变量。
其实这种定义常量的方法叫做宏定义。
不是真正意义上的常量定义,但是个人觉得使用这个更好,可以有效地区分开变量与常量。
【字符串】
字符串类型的变量,实际上就相当于c语言的字符数组,只是现在以变量的形式出现了。
因此我们对字符串可以有一些更简单的操作,但是在字符串的遍历上却又多了几分麻烦。
在php中,字符串需要使用双引号或单引号进行范围限定。
拼接字符串:
在php中使用“.”并置运算符呢进行字符串的拼接
php
$say=“Iam”;
$name=“shl_ky”;
echo$say.“”.$name.“.
”;
//下一行的代码(没有备注符号)输出结果与上面这一行相同请自行理解原因
//echo“$say$name.
”;
?
>
这段代码将在浏览器上打印“Iamshl_ky.”
是html中的换行便签,html等内容在php中,我们应该把它们当做字符串对待。
在这里大致介绍两个php的string库函数,事先声明,我们不需要写任何引入库函数文件的代码!
strlen(字符串);返回字符串长度
strpos(字符串,关键字);字符串定位,返回查找的字符串第一次出现的位置,第一个字符的位置是0。
更多string函数在库函数表中查阅。
【算数运算符与算数表达式】【赋值运算符与赋值表达式(以下表格来自W3SCHOOL)】
算数运算符
运算符
说明
例子
结果
+
Addition
x=2
x+2
4
-
Subtraction
x=2
5-x
3
*
Multiplication
x=4
x*5
20
/
Division
15/5
5/2
3
2.5
%
Modulus(divisionremainder)
5%2
10%8
10%2
1
2
0
++
Increment
x=5
x++
x=6
--
Decrement
x=5
x--
x=4
赋值运算符
运算符
说明
例子
=
x=y
x=y
+=
x+=y
x=x+y
-=
x-=y
x=x-y
*=
x*=y
x=x*y
/=
x/=y
x=x/y
.=
x.=y
x=x.y
%=
x%=y
x=x%y
比较运算符
运算符
说明
例子
==
isequalto
5==8returnsfalse
!
=
isnotequal
5!
=8returnstrue
>
isgreaterthan
5>8returnsfalse
<
islessthan
5<8returnstrue
>=
isgreaterthanorequalto
5>=8returnsfalse
<=
islessthanorequalto
5<=8returnstrue
逻辑运算符
运算符
说明
例子
&&
and
x=6
y=3
(x<10&&y>1)returnstrue
||
or
x=6
y=3
(x==5||y==5)returnsfalse
!
not
x=6
y=3
!
(x==y)returnstrue
除并联运算符外,所有运算符均与C语言一致。
三、简单的PHP程序设计——顺序程序设计
学过C语言之后,我们应该不用再去解释什么是顺序结构了吧?
现在我们来认识一下PHP顺序结构程序的一些需要注意的内容。
【PHP程序的入口】【声明PHP程序】
其实,我们看到这里,应该已经发现什么是php程序的入口了。
那就是“
php?
>”或者”
?
>”。
在这个符号之间的部分就是我们的php程序了。
这也是php作为脚本语言的特点。
在php中没有像C/C++一样的主函数入口。
在服务器解释php文件的时候,会忽略掉其他非php内容,当做字符进行处理,当遇到”
php”或者”
”的时候,开始去解释随后的php程序,而php程序结束的标志就是”?
>”。
按顺序解释下去,直到php文件结束。
在一个php文件中,php程序是可以分块出现的。
请看看下边这个事例:
—php文件开始—>
php
$value=“提交”;
$type=“button”;
?
>
认识php程序的入口phpecho$type;?
>”value=”
phpecho$value;?
>”/>
—php文件结束—>
这个事例在浏览器上显示出一个按钮,按钮的内容写的是“提交”。
当我们查看网页原文件的时候,我们会发下如下html代码。
上边的php文件,共有3个php程序块。
对比上面的php文件,是不是基本一样?
请同学们自己思考理解。
—php文件开始—>
认识php程序的入口
—php文件结束—>
思考:
如果php有一个循环,我么能不能在循环体中使用”?
>”结束php程序块?
如果可以,你觉得应该是怎样的操作?
如果不可以,为什么?
【赋值语句】
看了上面那么多代码,这个不用再讲了吧?
跟C是一样的。
【输入输出】
上面的代码,告诉我们,在php中我们一般使用echo进行输出。
但是如果我们想按一定格式输出呢?
拜托!
不要被c语言printf()局限成这样好不好啊!
比如我们有三个名为year,month,day的变量,要按照“年-月-日(换行)”的格式输出。
在c语言里我们写printf(“%d-%d-%d\n”,year,month,day);
在php中,我们只要按下面两种方式这样写就可以了!
①echo“$year-$monty-$day
”;
②echo$year.“-”.$month.“-”.$day.“
”;
哈哈,上面的第一种方式是不是看起来特别简单啊?
不过遇到下面的情况,你觉得会得到什么结果呢?
php
$name=“shl_ky”;
$name1=“SunHongling”;
echo“Mynameis$name1”;
?
>
这段代码所得到的结果是:
Mynameisshl_ky1
如果把上面第三行代码改写成echo“Mynamesis${name1}”;输出结果就是我们想要的那个了。
另外,在php中负责输出的还有print()函数。
而print_r(变量)则按一定格式输出变量的类型及其内容,在检查逻辑错误的时候其效果很好。
四、选择结构程序设计
其实,我愿意把程序设计的结构分成3个级别,分别是最近本的顺序结构,判断一下再往下走的选择结构,再有判断一下要不要兜几圈的循环结构。
那么下面我来介绍一下php中的选择结构。
其实PHP中的选择结构跟C程序中的语法结构是一样的,我们可是使用ifelse或者switch来完成选择结构。
书上说if语句有3种形式:
①if(条件){}
②if(条件){}
else{}
③if(条件){}
elseif(条件){}
else{}
但是,请大家仔细看看这3中形式,再去仔细想想“复合语句”,第二种形式和第三种有没有本质的区别?
变化在哪?
如果想明白,对你理解程序的语法结构会有很多帮助。
给一个实例,下面的代码进行权限的判断,如果具有该权限,那么权限的变量值为真,可以进行操作,如果为假,则提示错误。
php
$IsAdmin=true;
if($IsAdmin){
echo“欢迎您,管理员!
”;
}
else{
echo“您不具备登陆后台的权限!
”;
}
?
>
那么现在再通过实例的方式展示一下switch的用法(跟C语言是一致的):
php
$score=91;//百分制分数
switch((int)($score/10))
{
case10:
case9:
$mark=“A”;
break;
case8:
$mark=“B”;
break;
case7:
$mark=“C”;
break;
case6:
$mark=“D”;
break;
default:
$mark=“NP”
break;
}
?
>
在C语言里,91/10的结果是9,我想大家的印象非常深刻,因为我们使用的整形变量。
在php中,我们没有声明变量的类型,而变量类型也可以随时转换,那么根据系统的需要,$score/10在计算过程中会自动转换成浮点型,那么不利于这个程序的判断,因此我们使用(int)语句将计算结果强制转换成整形。
五、循环控制
与C语言相同,php的循环控制语句有goto语句、for语句、while语句以及do…while语句。
用法与C语言完全相同。
在此不再对这些语句进行详细的介绍。
下面用实例向大家展示一下for语句和while语句。
goto不推荐使用。
php
//for循环这个方法可以按000111的格式输出编号虽然不是最简方法
$no=111;//获取一个编号
for($temp="",$i=0;$no*pow(10,$i){
$temp.="0";
}
echo$temp.$no;
//while循环完成上述功能
$no=111;
$temp=“”;
$i=0;
while($no*pow(10,$i){
$temp.=“0”;
$i++;
}
echo$temp.$no;
?
>
实际上,在php中还有一个非常重要的循环,也是在php中用到最多的循环——遍历数组(foreach语句),这个语句将在下一章具体说明。
六、数组的使用
数组是非常重要的一种数据结构,也是很重要的一个工具。
NOW!
我们来看看PHP中的数组跟C语言的数组有何异同。
学习使用php数组的方法。
【数值数组】
关于数值数组,就是下标为0、1、2、3……的数组,同样也可以理解为下标变量。
在php中,就像不必声明变量一样,我们同样也不必声明数组。
所以,数组是没有上限的,不存在数组越界的错误。
在php中,数组是一种变量的类型,为了明确某一变量是数组类型,我们可以使用下面的语句进行声明:
$MyArray=array();
其实我也不确定,php中的array()是函数还是关键字,因为在php中没有多态,不能对函数进行重载,而下面代码的形式用来初始化数组。
——这段话听不懂以后再说,重点是下面的代码用来初始化数组。
(w3school把array()当做函数)
$MyArray=array(“苹果”,“鸭梨”,“香蕉”,“橘子”);
我们没有指定数组的下标,那么就会以默认的方式进行分配(0~n,类似C语言):
$MyArray[0]储存的“苹果”$MyArray[1]储存的“鸭梨”……
值得注意的是,我们的数组初始化后,就只能容纳4个元素了吗?
不是这样的,我们可以继续为数组添加元素。
使用下面的代码向刚才的数组新增一个元素:
$MyArray[]=“石榴”;
这个新增元素的下标会自动分配,$MyArray[4]。
当然我们可以指定一个下标来储存我们的元素。
如果指定的下标在数组中已存在,那么就相当于是原有的数组元素。
如果指定的下标在数组中不存在,那么就会插入该下标,并储存元素。
我们加入如下代码:
$MyArray[8]=“葡萄”;
那么此时,数组新增了下标为8的元素“葡萄”$MyArray[8]。
是不是很疑惑?
那下表为5、6、7的元素呢?
其实现在并不存在下标为5、6、7的数组元素。
但是当我们再次插入新的指定下标的元素时,如插入下表为5的元素,数组会自动填充到相应的位置。
另外,在php数组中,每个元素的变量类型是可以不同的!
这时候也许你会发现“php的数组好乱啊”。
而且会问“那我怎么才能遍历整个数组呢?
”,“我怎么才能知道我的数组有多少元素呢?
”,这些问题,我们留到本章后面来介绍。
带着你的疑惑继续往下看吧。
【多维数组】
二维数组,就是保存数组的数组,我希望大家能这样理解,不要去找什么二维坐标啦什么的去理解这个,因为找对象对号入座的理解方式不利于大家对多维数组的理解。
那么我们以二维数组为例,介绍多维数组。
有如下数组的初始化语句:
$MyKitchen=array(
array(“苹果”,“鸭梨”,“香蕉”,“橘子”),
array(“白菜”,“茄子”,“萝卜”,“芹菜”)
);
这个语句初始化了一个数组(我在这里不强调它是二维数组,只需要知道它是一个数组就可以了)——$MyKitchen,这个数组有两个元素,分别是$MyKitchen[0]和$MyKitchen[1]。
我们可以把$MyKitchen、$MyKitchen[0]、$MyKitchen[1]看做三个变量。
只是$MyKitchen[0]和$MyKitchen[1]属于我们的数组变量$MyKitchen而已。
而对于$MyKitchen[0]、$MyKitchen[1]这两个变量,每一个变量又以同样的方式保存了另外一个数组:
$MyKitchen[0]=array(“苹果”,“鸭梨”,“香蕉”,“橘子”);
也就是说我们的$MyKitchen数组保存了其他的数组。
此时,最底层的数组就是我们上一节介绍的一维数组,第二层的就是二维数组,由此可以推广到n维数组(多维数组)。
请仔细考虑此节介绍的多维数组的概念,务必要弄明白。
这样再做程序设计的时候会轻松很多。
想到《倚天屠龙记》里的内容,我希望同学们忘掉多维数组的概念,熟练的理解数组里的元素是什么类型的,在实际的应用中这点最重要。
【关联数组】
说到关联数组,我不得不说,这是php里很赞的地方。
这个东西在我们使用php的时候提供了很多便利。
那么什么是关联数组?
C语言中有没有这个东西?
首先举一个例字,是上一节中的事例:
$MyKitchen=array(
array(“苹果”,“鸭梨”,“香蕉”,“橘子”),
array(“白菜”,“茄子”,“萝卜”,“芹菜”)
);
从程序的思路上我们不难看出,$MyKitchen[0]是水果的数组,$MyKitchen[1]是蔬菜的数组,可是这是用我们人的大脑总结出来的!
在我们的程序中看起来并不直观。
那么我们能不能用$MyKitchen[“水果”],$MyKitchen[“蔬菜”]来表示这两个元素呢?
这个表示方式是正确的!
而且能够直观的告诉我们每一个元素的意义!
这里的“水果”、“蔬菜”就叫元素的“键”(Key),它是一个字符串,之前我们讲数组的下表,也是键。
每个元素都可以看作由两部分组成Key=>Value(中间的符号叫什么我忘了)。
这就是关联数组。
下面的代码用关联数组初始化上面提到的二维数组:
$MyKitchen=array(
“fruit”=>array(“苹果”,“鸭梨”,“香蕉”,“橘子”),
“vegetable”=>array(“白菜”,“茄子”,“萝卜”,“芹菜”)
);
【遍历数组】
之前讲的内容,在php中,我们的数组功能变得相当强大了,但是比C语言里的数组乱了许多,我们的下标不再仅仅是0、1、2、3……了,而且最大下标也不一定,甚至可以是一个空的数组。
我们想按照C语言的方法去遍历数组显然是不给力了~用for循环我们甚至没法去访问数组中的每一个元素,这可怎么办啊?
在之前的章节中,我们提到了使用foreach()去遍历数组。
下面我们来看看foreach语句的用法:
foreach($Arrayas$Value)
{
//这是一个循环遍历数组
//第一次进入循环时有一个元素指针指向数组的首元素
//之后每次循环之前元素指针自动后移
//如果是已经是最后一个元素那么跳出循环
}
用这个方式,我们就可以遍历我们这个凌乱的数组了。
但是关联数组的强大,有时候我们需要获取键名,同样是使用foreach()循环:
foreach($Arrayas$Key=>$Value)
{
//跟上一段代码类似这里的$Key就是当前元素的键名
}
这里讲的foreach()和for()while()循环一样都是循环结构使用的关键字。
【其他数组操作】
函数名
说明
count()
求数组元素个数
array_combine()
通过合并两个数组来创建一个新数组。
key()
函数返回input_array中位于当前指针位置的键元素。
reset()
函数用来将input_array的指针设置回数组的开始位置。
current()
数组当前指针位置的数组值。
不移动指针。
next()
函数返回紧接着放在当前数组指针的下一个位置的数组值。
prev()
函数返回位于当前指针的前一个位置的数组值,如果指针本来就位于数组的第一个位置,则返回FALSE。
end()
函数将指针移向target_array的最后一个位置,并返回最后一个元素。
其实,数组的使用技巧还很多,更多的使用方式和技巧,就由大家自己去学习,去发现吧。
七、函数
我们用模块的思想或者是面向对象(OOP)的思想设计程序,经常使用或者完成一定功能的代码,我们把它们封装起来,在需要的时候直接调用,这就