php的語法和c有什麼差別

青灯夜游
發布: 2023-03-09 08:20:01
原創
1802 人瀏覽過

語法上的區別:1、PHP使用define函數來定義常數,c語言不是;2、php的所有的變數名前都要帶個“$”,c語言不用;3、PHP不管常數還是變數都不需要先定義後使用(類別中的變數除外)。

php的語法和c有什麼差別

本教學操作環境: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!)。

這裡順便介紹一下,<?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
$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中文網其他相關文章!

相關標籤:
c php
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!