c語言與php有差別。差異有:1、c語言的變數需要先定義後使用,而PHP中不管常數或變數都不需要先定義後使用,會根據第一次賦值的情況自動決定資料型別;2、PHP中可用define函數定義常數,c不行;3、PHP變數名前要帶“$”,c不用;4、PHP有一個獨特的循環結構“foreach”,c沒有;5、PHP數組的鍵名可以是字串,而c數組的鍵名必須是整數且必須從0開始依序遞增。
本教學操作環境:windows7系統、c99&&php8版本、Dell G3電腦。
如果你學過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 define(“C1”,”Hello PHP World!”); echo C1; ?>
以上程式碼的運行結果是輸出常數C1的值(Hello PHP World!)。
這裡順便介紹一下,56fcdf8ab1e0f183dd48fd2580459a85是PHP程式碼的定界符,將PHP程式碼同HTML程式碼區分出來,PHP程式碼的語句以分號結束,這是我們習慣的,另外PHP的註解符號也與C一樣,你該知道的,我就不說了…
這個echo就相當於C的printf或C 的cout,但嚴格地說不是格式化的輸出,要想格式化也很容易,你把HTML程式碼寫進去就行了,例如你要輸出結束後換行,那你就寫成define(“C1”,”Hello PHP World!0c6dc11e160d3b678d68754cc175188a”);好了。
注意,PHP也支持'\n'作為換行符,但是它的含義僅僅相當於在HTML裡敲個回車,瀏覽器裡看還是在一行上的。
變數
#除了不用定義,C語言使用者最不習慣的就是所有的變數名稱前都要帶個$,你可能會抱怨PHP的設計者太財迷了,但抱怨完了你還得這麼寫,寫PHP程序,Shift鍵的使用率陡增!
我突然發現一個這樣做的好處是:常數不帶$,因此常數與變數的區分變得很明顯,更重要的是,你再也不用擔心自訂變數名同PHP關鍵字衝突了,你可以定義一個變數叫$if,$ for等(當然,正式情況下還是不要這樣做的好,過癮就行了)。
與C相同的是,PHP的變數名是大小寫敏感的,並且命名方式遵循C標識符的命名原則,還記得嗎?
如果你懂点C++,知道引用的概念,下面这段就可以跳过,只要记住PHP也支持引用。否则花点时间看下面这段或是去看看C++引用的概念也行。
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 $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 $a="newname"; $$a="content"; //newname本是$a的值,但是$$a的含义是以$a的值为名的变量 echo $newname; //$$a等价于$newname echo $a; ?>
运算符和表达式
PHP在运算符和表达式方面和C极其类似,有算术、逻辑、关系、位运算符及相应的表达式,也有条件运算符(:?)及其表达式,同样还是我们开始提到的那个思想,实用为上,很多限制被取消了,相对较宽松。举个例子:
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 $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代码:
$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 $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 $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吧。
推荐教程:《php教程》
以上是c與php有差嗎的詳細內容。更多資訊請關注PHP中文網其他相關文章!