語法上的區別:1、PHP使用define函數來定義常數,c語言不是;2、php的所有的變數名前都要帶個“$”,c語言不用;3、PHP不管常數還是變數都不需要先定義後使用(類別中的變數除外)。
本教學操作環境:windows7系統、PHP7.1&&c99版,DELL G3電腦
語法上,php和C語言的差異
常數
在PHP中定義常數的方式在學習C的人看來有點不可思議,竟然是用一個define函數實現的,PHP的函數實在是太厲害了,後面我們會看到定義數組也是由函數完成的,我們真得感謝PHP無比豐富的函數庫,它們成就了PHP的易用和強大。
define函數原型:bool define(string name,value,[,bool case_insensitive])
第三個參數如果是TRUE,則表示常數名稱是大小寫不敏感的,反之就是敏感的,預設是敏感的。我們還是遵照習慣,保持常量名稱大小寫敏感吧。
範例:
<?php define(“C1”,”Hello PHP World!”); echo C1; ?>
以上程式碼的運行結果是輸出常數C1的值(Hello PHP World!)。
這裡順便介紹一下,8d8e2522a1f26fe88db102708ab49a31
是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 $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 $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 $a="newname"; a="content";//newname本是$a的值,但是a的含义是以$a的值为名的变量 echo $newname; //$$a等价于 $newname echo $a; ?>
运算符和表达式
PHP在运算符和表达式方面和C极其类似,有算术、逻辑、关系、位运算符及相应的表达式,也有条件运算符(:?)及其表达式,同样还是我们开始提到的那个思想,实用为上,很多限制被取消了,相对较宽松。举个例子:
<?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的数据类型
PHP与C的一个显著不同是:不管常量还是变量都不需要先定义后使用(类中的变量除外),PHP根据第一次赋值的情况自动决定数据类型。想想当年学习C语言的时候,我们曾感到先定义后使用很麻烦(但是“长大后”(我是指学会C后)都体会到了它的好处),常常忘记定义,而现在少了这条规矩,反而有点不适应了。
PHP的基本变量类型有整型(Integer)、浮点型(Float)、字符串(String)(这是C没有的,但C++有String类)以及布尔型(Boolean)(C没有,但是C++有)。构造类型有数组和对象。此外还有两个特殊类型:空值(NULL)(C也有)和资源(Resource)。
推荐学习:《PHP视频教程》
以上是php的語法和c有什麼差別的詳細內容。更多資訊請關注PHP中文網其他相關文章!