本教程操作环境: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等价于 $newnameecho $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有什么区别的详细内容。
