关于php的一些小结

来源:互联网 发布:我的心时刻牵挂着网络 编辑:程序博客网 时间:2024/05/01 17:33

  php是一种动态的弱类型语言。

  先说明下编程语言的动态性和静态性,静态性语言指的是,在编译时,为变量开辟指定内存空间,直观的形式表达,就是必须要为变量指定类型,例如c/c++,c#,java等,为变量指明类型,编译器在编译的时候,就按照类型开辟内存空间,然后将此空间与变量名关联。动态语言,指的是在变量声明的时候,并不指定类型,而是只建立一张映射表,变量的开辟内存的时间,是在运行时候,第一次被赋值后,根据被赋的值开辟的内存大小,直观的形式便是在编写代码时,并不给变量指定类型,例如脚本类语言php,python,perl,以及javascript,变量真正获得内存空间的时机,是在第一次被赋值时。

注意一下代码:

int say(char *str){   printf("%s\n", str);   return strlen(str);}int main(void){   char *str = "hello world";   say(str);}

对比下php:

function say($str){   print "say: "$str."\n";   return strlen($str);}$str = "hello world";say($str);


c代码中,变量需要预先被声明类型,java与c#沿袭了这个特点,在编译过程中,就已经将内存申请给了变量str,开辟内存的大小依据声明的类型而定。

php的代码中,变量的内存,直到开始运行,才江南字符串的首地址赋予了变量$str,变量的内存大小,依据第一次赋值情况而定。

下面谈下弱类型与强类型,这 其中有个很容易误解的地方,就是以为动态语言都是弱类型,静态语言都是强类型,这种误解的根源,是没理解语言的强弱的真正含义。

所谓强类型,指的是变量的类型确定后,如果要改变变量的类型,自身并不会自动进行转型,必须强制进行转换。(java的子类对父类的可以自动上转型,但必须强制下转型,是因为子类为父类的扩充,或者说父类是子类的子集,子类本身就囊括了父类的属性。)如果要改变变量的类型,通行规则是在变量赋值前,用(新类型)予以改变,如整形与浮点型间的互换,整形与字符类型的强制转型。

而弱类型,是指变量的类型会根据环境需要进行自动转换,不需要强制对其进行转换申明。比如在php中


$x = "3";$y = $x+5;print $y."\n";var_dump($x);var_dump($y);

输出:

8string(1) "3"int(8)

输出结果为8,这其中并没有对$x进行强制转义,但$x在运行时根据需要自动为整形,随后又恢复原有类型。

值得注意的是c归于为弱类型,是因为在进行数值运算时,会自动进行整形与浮点型间的转型,而java在进行数值运算时,则必须强制转型。

虽然以上分析看起来有点流于理论派,但这些基础的观念如果不理解明白,以后在遇到具体问题时,会因基础的缺乏而不知所言。

关于php的字符串:

php的字符串其实是一个字符类型的数组,php没有字符类型,但可以用数组长度为1的字符串表示。

与java字符串的区别:为了Java的纯面向对象特性,甚至将所有的基本类型都有对应的对象形式存在,字符串可以转型为String类型,构成对象形式,但php的字符串,就没有如此纯粹的面向对象的处理方式。

与c字符串的区别:c对于字符的处理是相当底层的,如果按照整形打印一个字符,会打印出对应的ASCII码,所以在处理方式上,也是以单个字符为基础。字符串是以\0(是零,不是字符O!),也就是NULL作为分隔符和结尾符,在输出时,遇到\0,则会认为字符串已经到达结尾处,从而停止输出,在字符串的末尾,会自动添加一个\0的空字符作为结尾标识。php中的字符串,遇到\0也同样会停止,但在结尾,却不会添加\0。所以同样的字符串,php的长度比c要少一,便是最后的\0。

关于php的array:

php的数组在别的语言里绝对不是数组这个概念,php的数组是一种映射关系,有点像哈希表,在java里,很明显就是类集中的Map,键值匹配,自动增长,迭代访问,这些无疑都是类集的特性,但php里,这些特性被弄成了array数组类型,而且列为8个类型之一。数组可以被foreach循环迭代输出,如果熟悉Iterator接口,会发现Iterator的机制正是array, 在用foreach循环迭代输出时,迭代器的作用作用类似于array,除了key被设定为自动增长,array的默认key,同样是从0开始自动增长的。需要说明的是如果要用foreach将对象迭代输出,那么该类并不必须实现Iterator接口,如果类的属性是public的,那么遍历的时候,变量名字会成为key,变量的值会成为value。

关于有符号与无符号的处理:

注意,php是没有无符号数的,无论是int类型还是float,都是有符号的。
这里提下关于C语言有符号和无符号的一些很有意思的地方:
#include <stdio.h>#include <string.h>int main(){    unsigned int a=20;    signed int b=-130;    char x = a>b?'a':'b';    printf("%c\n", x);}

运行之后,可以发现输出为b, 这和常识违背,-130>120,这是很违背逻辑的。要理解这点,需要明白有符号和无符号数的存储方式以及数值运算的一些优先级规则。无符号数,所有的位都是数值,有符号数,最高一位为符号位,取值范围按相应的位数进行变动。
但值得注意在C语言中,有符号数在和无符号数之间进行操作,编译器会自动将有符号数转型为无符号数后继续处理,如上代码所示。
这里参见 有符号数与无符号数 
0 0
原创粉丝点击