带你深入理解php与C说话的区别
假如你学过C说话,此刻想学习PHP,第一步当然是把握根本语法。PHP的根本语法与C极其类似,但也有一些奇特之处,本文通过对照的方式,依照学习C说话语法的次序,介绍PHP的根本语法,但愿能帮忙熟知C的人快速入门。
第一明白一个思想,PHP语法与C最大的不一样之处在于PHP重有用,而C重道理。学习C的语法,培养人严谨的思维习惯,关于理解运算机的工作道理是很有帮忙的。一个学过C的人开端学PHP,会对PHP过于宽松的语法感到不顺应。
PHP的开创人是为了更新本人的主页而设计PHP的,不是像C的开创人那样为了开发操纵系统,这是两者语法风格不一样的基本缘由。
明白了这个思想,我们就依照数据类型、常量、变量、运算符与表达式、流程操纵、函数、数组这样的次序来一一介绍PHP的根本语法并与C相对比。
由于是入门,所以我们只沿着主干道前进,路边有许多艳丽的光景,像正则表达式之类,我们今后再专题摸索。
PHP的数据类型
PHP与C的一个显著不一样是:不管常量还是变量都不需要先定义后使用(类中的变量除外),PHP按照第一次赋值的状况主动决议数据类型。
想想那年学习C说话的时候,我们曾感到先定义后使用很费事(但是“长大了以后”(我是指学会C后)都体味到了它的好处),常常健忘定义,而此刻少了这条规矩,反而有点不顺应了。
PHP的根本变量类型有整型(Integer)、浮点型(Float)、字符串(String)(这是C没有的,但C++有String类)乃至布尔型(Boolean)(C没有,但是C++有)。结构类型有数组和对象。此外还有两个非凡类型:空值(NULL)(C也有)和资源(Resource)。
常量
在PHP中定义常量的方式在学习C的人看来有点不成思议,居然是用一个define函数实现的,PHP的函数实在是太凶猛了,后面我们会看到定义数组也是由函数完成的,我们真得感激PHP无比丰硕的函数库,它们成就了PHP的易用和强大。
define函数原型:bool define(string name,value,[,bool case_insensitive])
第三个参数假如是TRUE,则表示常量名是大小写不敏锐的,反之就是敏锐的,默许是敏锐的。我们还是遵照习惯,保持常量名称大小写敏锐吧。
例:
复制PHP内容到剪贴板
PHP代码:
<?php define(“C1”,”Hello PHP World!”); echo C1; ?>
以上代码的运转结果是输出常量C1的值(Hello PHP World!)。
这里顺便介绍一下,<?php和?>是PHP代码的定界符,将PHP代码同HTML代码区分出来,PHP代码的语句以分号完毕,这是我们习惯的,别的PHP的注释符号也与C一样,你该知道的,我就不说了……
这个echo就相当于C的printf或C++的cout,但是严厉地说不是格局化的输出,要想格局化也很容易,你把HTML代码写进去就行了,比方你要输出完毕后换行,那你就写成define(“C1”,”Hello PHP World!<br>”);好了。
留意,PHP也支撑‘\n’作为换行符,但是它的含义仅仅相当于在HTML里敲个回车,阅读器里看还是在一行上的。
变量
除了不消定义,C说话会员最不习惯的就是所有的变量名前都要带个$,你大概会埋怨PHP的设计者太财迷了,但埋怨完了你还得这么写,写PHP程序,Shift键的使用率陡增!
我忽然发明一个这样做的好处是:常量不带$,因此常量与变量的区分变得很明显,更重要的是,你再也不消担忧自定义变量名同PHP关键字冲突了,你可以定义一个变量叫$if,$for等(当然,正式状况下还是不要这样做的好,过过瘾就行了)。
与C雷同的是,PHP的变量名是大小写敏锐的,并且命名方式遵照C标识符的命名原则,还记得吗?
假如你懂点C++,知道援用的概念,下面这段就可以跳过,只要记住PHP也支撑援用。不然花点时间看下面这段或是去看看C++援用的概念也行。
复制PHP内容到剪贴板
PHP代码:
<?php $var1=100; $var2=&$var1; $var2=200; echo $var1.”<br>”; echo $var2; ?>
这段代码的运转结果是输出两个200,离别是$var1和$var2的值,输出的时候为了分明加了个换行符,PHP里句点(.)是字符串的连接符。
为什么只给$var2赋了200,而$var1也变成了200呢,你还可以试试只改动$var1的值,你会发明这两个变量好像被绑在一起了。
其实语句$var2=&$var1;中的&符号的含义是将变量名$var2也指向$var1所在的储备空间,也就是说$var2并不是一个新变量,而是$var1的另一个名字,它们对应的是统一段内存空间,不管使用谁都是拜访的统一个变量,$var2就叫做对$var1的援用。
援用有什么好处?今后再说。C说话的根本概念(变量名、变量地址、变量值)分明的话,懂得起来应当没有什么艰难,假如根本概念不分明,还是先“温故”再“知新”吧。
顺便说一个成心思的事,假如你在把上面的echo语句写成:
echo“The value of $var1 is”.$var1.”<br>”;
那么你得到的输出将是:
The value of 200 is 200
还记得吗,在初学C说话时你很大概犯过把变量名放在字符串里想输出它的值,结果得到的是变量名,而此刻,你的“抱负”实现了,而你却又不习惯了,呵呵。
本来PHP在使用双引号作为字符串的定界符时,会主动把变量名更换成响应的值,这样的做法使得我们输出含变量的字符串时变得非常利便,一对双引号下来就可以了。假如你想保持变量名原样输出,那么可以用单引号做字符串的定界符(当然还有其它方法,你可以细心研讨一下PHP的字符串)。
还是要感激C的严厉要求,假如C像PHP这样的话,我们恐怕到此刻也搞不清变量名、变量值这些概念。
变量的作用域
PHP的变量作用域与C很相似,在此不预备多说。部分变量在所存在的函数内部有效,全局变量作用域是文件作用域(限于单个PHP文件),若部分变量同全局变量重名,同C的处置方式,全局的被屏蔽。
轻微费事一点的是,要想在函数内拜访全局变量,需使用global关键字声明,不然的话PHP就认为是一个与全局变量同名的部分变量。
复制PHP内容到剪贴板
PHP代码:
<?php $a=1; function func() { echo "The value of a is:".$a; } func(); ?>
以上代码没有输出1,为什么呢?PHP把函数里的$a看作是一个全新的部分变量,此$a非彼$a(函数体外的全局变量),此$a未赋值,因此输出为空。
假如我们要想在函数体内部拜访全局变量$a的值,须在拜访此前声明一句:global $a; 这样PHP就知道要拜访的是全局变量$a了。
还有一种办法是利用PHP的系统数组$GLOBALS,该数组是PHP系统主动生成和保护的,它记载了所有全局变量。echo $GLOBALS[“a”];即可输出其中$a的值。
PHP的静态变量仅在部分函数域中存在,同C是完全雷同的。
PHP有一种非凡的动态变量,名字听起来很容易让人认为就是C说话的一般变量(动态的、部分的),但这个动态的含义有点非凡,它是指变量名可以动态给予!也就是说,可以让利用程序的终究会员为变量指定名字!
复制PHP内容到剪贴板
PHP代码:
<?php $a="newname"; $$a="content"; //newname本是$a的值,但是$$a的含义是以$a的值为名的变量 echo $newname; //$$a等价于$newname echo $a; ?>
运算符和表达式
PHP在运算符和表达式方面和C极其相似,有算术、逻辑、关系、位运算符及响应的表达式,也有前提运算符(:?)及其表达式,一样还是我们开端提到的阿谁思想,有用为上,许多限制被取消了,相对较宽松。举个例子:
复制PHP内容到剪贴板
PHP代码:
<?php $a="1"; $b=1; if ($a==$b) echo "Equal!"; else echo "Not Euqal!"; ?>
依照C的思维方式来看,$a是字符,$b是整型,两者比力是字符的ASCII码值与整数比力,明显不等,而PHP运转结果却是“Equal!”,看到这里,是不是有点冲破封建大家庭的礼教与心上人私奔的感受?呵呵,抑或是惊呼PHP没法无天?
接下来还有让你束手无策的,若$a="1e3"; $b=1000; 仍然是“Equal!”,也就是说PHP在比力时能主动将字符串“依照人的懂得方式”停止转换,1e3不就是科学计数法表示的1000吗?乃至$a=”1e3HelloWorld”;都会相等
PHP将字符串转换为数值时会主动截取全部它能懂得为数值的部分!
其实C也同意跨过数据类型的比力,比方字符型和整型比力,C也会主动转换类型,但它是“依照运算机的思维方式”转换的,由于字符在运算机里就是依照ASCII码储备的。
PHP的“人性化”也带来了费事,当我们想严厉比力两个变量的时候如何办呢?
于是PHP供给了一对非凡的运算符:全等(===)和非全等(!==),只要当值相当且数据类型雷同时,才叫全等,两者有一不符,则非全等。
此时,即便1与1.0也是非全等的,缘由你必然知道吧。假如你觉得只要这样才扎实,那么恭喜你,你已经被C洗脑了。
运算符有优先级和结合性的概念,这方面和C是相似的,你或许记不清所有的优先级关系,但是不妨,我们有括号呢。
流程操纵
PHP的流程操纵语句是与C最像的部分了,几乎可以照搬。
有两点值得留意,一是switch case语句中case后面可以写任意表达式,而不是C规定的只能是常量表达式,C的这种规定太不近人情了,以至于许多人学完了C还不知道case score〉90:这样的写法错在哪里。此刻好了,PHP里面,你可以这样写了。
再就是很惊奇的一点,if elseif else构造中心的else和if可以连在一起写。
此外,PHP还有一个奇特的轮回构造foreach,是专门为数组遍历预备的,稍后介绍。
函数
PHP会员自定义函数的语法与C也很相似,不言而喻,由于PHP弱化数据类型的概念,所以函数的返回值类型也就弱化了,函数定义的一样情势是:
function函数名($参数1,$参数2,……,$参数n) { 函数体 return语句返回值 }
比C的“宽松”之处在于函数可以嵌套定义,但是为了一个明晰的代码构造,还是严厉要求本人的好。
这里我们再说说援用。前面提到援用其实就是给变量取个小名(专业的话叫别号),即两个或多个变量名对应统一变量储备空间。
这一概念用在函数参数上特殊有用,我们知道实参与形参的结合是单向值传递,即实参将它的值复制给形参,而形参变量在函数体中大概被改动
但由于形参变量会在函数返回时被撤销,所以形参不克不及将改动了的值传回给实参,这是学C的人都应当十分分明的,大家都做过阿谁交流两个数的实验。
这一机制包管了函数只能有一个返回值,当需要返回多个值的时候,我们可以使用援用做形参,这相当于把实参的地址传递给函数,函数对这个地址上的数据停止操纵,当然就可以把改动保存下来。
援用的概念是C++里增添的,PHP的函数也支撑援用做形参。只要把C++里援用做参数的概念懂得分明了,在PHP里是完全一样的。
PHP有宏大的函数库,比方关于时间的函数就有一大堆,写PHP程序时,当你有个功效想要实现,第一件事应当是查PHP函数手册,看看有没有能知足你的要求的函数,或者是通过多个函数组合实现也行,而不是本人动手去写(练习编程技艺或改善PHP者除外),记住一句老话:不要反复创造轮子。
要想把握PHP,熟练使用常用函数是必需的,但这不是我们这篇文章的目标,有时机专题摸索吧。
数组
这回甭盼望我说PHP的数组和C差不多了,由于PHP的数组,几乎就不是C的数组!PHP的数组应当叫做“汇合”,不是紧急汇合的汇合,是数学意义上的汇合,假如你学过数据构造就更清楚了。
说白了,PHP的数组就是把一堆数据(什么类型都行)放在一起。这在C里是很疯狂的设法,但是在实际中是很有用的,比方一条数据库记载大概由整型、字符串型、浮点型等不一样类型的若干字段组成,
假如能一次读取出来放在一个“数组”中用下标拜访,是不是很利便呢?这种“数组”,是不是很像C的构造体呢?其实它比构造体还灵敏,它可以主动增减数据元素。
PHP数组的定义是通过array函数实现的,一样情势为:
$数组名=array(键名=>数据,键名=>数据,……, 键名=>数据);
这里的键名在C中叫下标,C规定下标必需是整数且必需从0开端顺次递增。
在PHP里,键名非常人性化,对应的数据假如储备的是姓名,键名就可以叫name,是结果,就可以叫score,当然你假如想用整数也可以,随你的便。假如你懒得在定义数组时指定键名,可以这样写:
$数组名=array(数据1,数据2,……, 数据n);
这时候PHP会依照C说话的方式按数据的前后次序从0开端主动给予整型键名。
PHP供给了一个特殊利便的显示数组全部元素的函数print_r
复制PHP内容到剪贴板
PHP代码: <?php $arr1=array(100,200,300,400); $arr2=array("num"=>100,"name"=>"Liuxy","score"=>98); print_r($arr1); echo "<br>"; print_r($arr2); ?>
以上代码的输出结果如下:
Array ( [0] => 100 [1] => 200 [2] => 300 [3] => 400 ) Array ( [num] => 100 [name] => Liuxy [score] => 98 )
若要定义二维数组,可以嵌套地使用array函数,同C相似,也是把二维数组的每一行看作是一个一维数组,构成每一行的一维数组可以互不雷同。如:
复制PHP内容到剪贴板
PHP代码:
$arr=array( "row1"=>array(100,200,300,400), "row2"=>array("num"=>100,"name"=>"Liuxy","score"=>98) );
PHP数组元素的拜访同C相似,都是数组名[键名]的情势。
PHP数组的遍历可以通过foreach语句实现,foreach语句格局如下:
foreach (数组名as 变量名)数据元素处置语句;
翻译成C说话就是:
for(i=0;i<n; i++){变量名=a;其他包括“变量名”的处置语句} foreach等价于前面的for (i=0;i<n; i++)
as等价于“变量名”与a之间的等号,这下你清楚了吧。
例如:
复制PHP内容到剪贴板
PHP代码:
<?php $arr=array(1,2,3,4,5,6); foreach ($arr as $value ) echo”$value<br>”; ?>
输出结果是啥?想想看。
假如还想把对应的键名也同时输出出来,可以用这样的情势:
foreach ($arr as $key=>$value) echo“键名为$key的元素值为$value”;
在C中遍历二维数组我们一样用二重for轮回,响应地,PHP中的foreach也可以嵌套使用,剖析一下下面的程序你就清楚了:
复制PHP内容到剪贴板
PHP代码:
<?php $arr=array( "row1"=>array(100,200,300,400), "row2"=>array("num"=>100,"name"=>"Liuxy","score"=>98) ); foreach ($arr as $key=>$value) { echo "$key=>$value"; echo "<br>"; foreach ($value as $k=>$var) echo "$k=>$var<br>"; } ?>
PHP的数组元素是可以动态增长的,这是C里面不敢想的。
为数组增添一个元素很简便,同拜访数组元素一样,只不外键名是新的或者为空,如$arr[new]=3; 或$arr[]=3,这样做的结果是PHP为数组$arr增添一个键名为new的元素其值为3,若键名为空,则以当前整型键名的最大值加1作为默许的键名分配给新的元素。
PHP的这种动态增长数组有时候很利便,但也带来隐患,比方当我们妄想修改已存在的元素值而写错了键名时,就变成了新增一个元素,而这样的逻辑错误,系统是不会报错的。
可以增长就可以缩减,要想删除一个数组元素,可以使用unset函数,如删除上面新增的阿谁元素,可以写成unset($arr[new])。也可以使用unset函数删除整个数组构造,如unset($arr),要留意这同逐个删除全部数组元素不一样,后者还保存有数组的构造。
形象地说,后者是室迩人遐,但楼还在,前者连楼也拆除了。成心思的是删除数组全部元素后假如新增一个元素,它的默许键名将持续此前数组的最大键名递增,要想从0开端,可以使用array_values函数重置,如$arr=array_values($arr)。
提示大家的是,PHP为数组的排序、查寻、合并、拆分供给了大量函数,用到这些根本算法时,不消再去翻数据构造课本了,呵呵……
这个专题主要把精神集中在PHP的根本语法上,通过与C的对照来加深懂得,有许多细节问题未深入计议。学习任何东西都是一个螺旋上升的历程,我们先阅读一下知识脉络,更多的需要在实践中去体味。
下一个专题我们是不是研讨一下PHP5的面向对象?你大概会说“我没学过C++”,不妨,这回我们不比力了,C++的面向对象概念是所有说话中最复杂的,而PHP5的面向对象由于是从有用动身所以比力简明,你无妨先学PHP5的面向对象,懂得面向对象的概念,然后再去啃C++的OOP吧。
感激大家的阅读,但愿大家收益很多。
本文转自: https://blog.csdn.net/ailxxiaoli/article/details/52199337
引荐教程:《php教程》
以上就是带你深入理解php与C说话的不同的具体内容,更多请关注百分百源码网其它相关文章!