[PHP] 浅谈PHP之美
另载,http://blog.1988de.com/?p=1018
------------------------------------------
语言排行 2012年
1 C 1972
2 java 1995
3 Object-C 1986
4 C++ 1983
5 PHP 1994
6 C# 2000
8 Python 1989
9 Perl 1987
大家都知道,Facebook、淘宝早期都是用PHP写的,在中国,PHP在百度、新浪、腾讯这三大互联网公司中应用比较多。
据了解,就中国的互联网巨头公司,基本都会使用PHP语言,就连主要使用JAVA的淘宝、支付宝等公司也会用到PHP。
(这些只从他们对PHP的招聘计划中就能看出来)
C诞生于1972的贝尔实验室,java诞生于1995年SUN公司。
1994年,PHP是由Rasmus Lerdorf开始用perl写的一个网站维护和流量统计小工具。
1995年,用C重写,并发布了PHP1.0.
1997年,以色列两哥Zeev Suraski 和 Andi Gutmans重写了PHP编译器,并在1998年发布了PHP3。
2000年,以Zend Engine 1.0内核为基础的PHP 4发布。此之前PHP只是面向过程的。
2004年,PHP 5发布了,从此PHP迈向面向对象行列,这时PHP也在中国得到了空前的发展。
2013年,PHP最新版本5.5.7,我们线上使用的是5.3.25。支持命名空间、新的垃圾回收机制、内置php-fpm等特性。
2014年10月16日,鼓励用户升级到这个版本PHP 5.6.
2014年,PHP7的开发提上议程,号称将要打破一切。 PHP目前是由Zend公司支持,由社区主导开发的语言,相比java目前落户于oracle,还是有点草根的。
但是,近几年PHP引入面向对象后的发展还是很可观的。
PHP能在web开发中的占据一席之地,必有其原因
1、进入门槛低,上手快(但是任何程序开发的深入,都需要涉及到一定计算机和软件工程等专业知识体系的基础)
2、开发、部署、调试非常方便快速(这也是很多大型互联网公司会使用PHP的原因之一)
3、非常适合中小型Web网站开发(换句话说,非常适合创业公司)
4、大型web系统的粘合剂
5、适合基于web的linux系统管理
PHP(PHP: Hypertext Preprocessor的缩写,中文名:“PHP:超文本预处理器”)(具体介绍参加维基百科)
PHP之美,她到底美在何处:
1、语法简单灵活 每一种编程语言,都是基于某个特定环境为了解决某一类问题而诞生的。
就如人类语言的诞生,是某个孤立的群体,为了个体间的有效沟通,而形成的特定语言。
而编程语言是人与计算机,计算机与计算机之间为了更有效的沟通,而形成的特定语言。
所以,在理论上,其他编程语言能做的事,PHP也都可以实现,但PHP的强项,就是WEB开发。
(因为PHP是在互联网浪潮到来时专为WEB开发所诞生的)
PHP的流行,其简单易学的语法功不可没,换句话说,学习PHP门槛低,上手快。
这也促使大量其他行业人员选择PHP尝试进入IT行业,还有其他语言开发者选择转入PHP开发等。
像百度这些大型互联网企业,每年都会录取大量科班出身的C或java的开发者,从0开始培训PHP。
PHP 语法的实现,其实是基于C,并混合了Java、Perl 以及 PHP 自创新的部分语法等。
说白了,PHP其实就是集编译、执行为一体的用C实现的“大型程序软件”。
其简单灵活的语法规则,使得PHP在开发、部署、调试非常便捷,这是PHP最大的优势。
毫不夸张的说,PHP可以做到随写、随测、随时上线,这种特性是静态编译语言所无法替代的。
2、无所不能的数组 PHP 中的数组实际上是一个有序映射。映射是一种把 values 关联到 keys 的类型。
PHP的数组包括索引数组和关联数组,
所以,完全可以把它当成真正的数组,或列表(向量),散列表(是映射的一种实现),字典,集合,栈,队列以及更多可能性。
其中,key 可以是 integer 或者 string。value 可以是任意类型。这里的key会有强制转换。(参见手册)
下面列了两个例子: <?php $arr = array(); $arr['$usd'] = '$usd'; $arr['0.5'] = '0.5'; $arr['-1'] = '-1'; $arr['//'] = '//'; $arr['%%'] = '%%'; $arr['??'] = '??'; $arr['**'] = '**'; $arr['呵呵'] = '呵呵'; $arr[8.7] = 8.7; // array(8=>8.7) print_r($arr); ?> <?php function getArray() { return array(1, 2, 3); } // on PHP 5.4 $secondElement = getArray()[1]; // previously $tmp = getArray(); $secondElement = $tmp[1]; // or list(, $secondElement) = getArray(); ?>
Copier après la connexion
此外,PHP提供了非常丰富的数组相关操作函数,包括拆分、合并、追加、查找、删除、排序等等。
3、弱类型 参见:http://www.laruence.com/2008/08/22/412.html
弱类型,就是说PHP并不严格验证变量类型,在申明一个变量的时候,并不需要显示指明它保存的数据的类型:
<?php $var = 1; //int $var = "laruence"; //string $var = 1.0002; //float $var = array(); // array $var = new StdClass; //object; ?>
Copier après la connexion
当然,对于PHP的弱类型,有其优势,也有其劣势,这里我们只说它的优势:
PHP的数据类型有3类8种:
整型int、浮点型double/float、boolean、字符型string(标量)
索引数组/关联数组、对象(复合)
资源、NULL(特殊)
弱类型最大的优势,就是开发者不用去关心变量类型,只要知道该变量目前的值是否是自己当前需要的就够了。
如,当有程序返回值时,我们的判断可以这样: <?php if ($return) { //我们这样就可以判断是否有返回值了 echo 'OK!'; } ?> 如,值的比较: <?php if ($test == 1) { //$test 可以为TRUE、整数1、浮点1.0、字符‘1’ } ?>
Copier après la connexion
在PHP中,所有的变量都是用一个结构-zval来保存的, 在Zend/zend.h中我们可以看到zval的定义: typedef struct _zval_struct { zvalue_value value; zend_uint refcount; zend_uchar type; zend_uchar is_ref; } zval; 其中zvalue_value是真正保存数据的关键部分,现在到了揭晓谜底的时候了,PHP是如何在ZE的基础上实现弱类型的呢? 因为zvalue_value是个联合体(union), typedef union _zvalue_value { long lval; double dval; struct { char *val; int len; } str; HashTable *ht; zend_object_value obj; } zvalue_value;
Copier après la connexion
借用这样的机制,PHP就实现了弱类型,因为对于ZE的来说,它所面对的永远都是同一种类型,那就是zval。
4、函数库 使用过PHP的童鞋应该知道,PHP拥有大量的系统内置函数。还有,应该尽可能的使用内置函数,效率高。
<?php function myrow($id, $data) { return "<tr><th>$id</th><td>$data</td>\n"; } $arr = get_defined_functions(); print_r($arr); ?>
Copier après la connexion
5、扩展 目前PHP的第三方包管理工具,如pecl、pear、composer等,包括了很多优秀的类包和扩展。
也就是说,我们很多功能模块,可以直接采用现有的类包了,因为它们很多的确很优秀。
PECL是PHP扩展库,提供了所有已知的扩展和托管设施的目录,下载和PHP扩展的开发。
PEAR - PHP扩展和应用库
Composer PHP的包的依赖管理程序
除了以上这些,PHP的ZE内核对外提供了扩展接口,也就是说,我们完全可以写C扩展,并动态加载到PHP中使用。
这样,可以提高一定的性能。
Yaf框架,就是基于这种特性开发的。
6、LAMP关键词 众所周知,LAMP,这个web开发的黄金组合,包括目前流行的LNMP等。
为什么这四个会走在一起呢,这需要回头看看发展历史了:
Linux,该操作系统的内核由林纳斯·托瓦兹在1991年10月5日首次发布。Linux也是自由软件和开放源代码软件发展中最著名的例子。
Apache,是Apache软件基金会的一个开放源代码的网页服务器,1996年4月以来,Apache一直是Internet上最流行的HTTP服务器:1999年5月它在57%的网页服务器上运行,到了2005年7月这个比例上升到了69%。
MySQL,一个开放源代码的关系数据库管理系统,几度被sun收购,09年被oracle收购sun,而正式落户甲骨文。
PHP,PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”。是一种开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。
这四个家伙,都有一个共同的特点,就是成功的开源软件。
由于其开源免费,并基于linux平台集成安装,更重要的是LAMP完全适应了互联网浪潮,高效、快速、低成本,导致LAMP所向无敌。
7、开源及其社区 PHP的开源性,包括很多成熟和活跃的社区,在zend公司带领之下,PHP逐渐走向成熟,尤其在PHP5.3之后,越来越适应更多的场景和需要了。
PHP的美中不足,不足在何处: 1、语法简单灵活 PHP语法的简单和灵活,同时也是PHP的软肋。PHP在一定程度上不适合大型企业使用,部分原因就在于此。
使用过JAVA的童鞋,来看PHP,都会觉得PHP太弱了,是的,JAVA拥有成熟的平台、框架、规范、标准。
但是,笔者认为,如果可以很好的规范、设计和架构整个PHP开发,PHP同样可以适用于大型企业,百度,新浪就是对PHP实践的很好案例。
2、没有多线程,没有RPC PHP的语言设计上,没有多线程编程,没有RPC远程调用,但是业界存在很多实现PHP多线程的解决方案。
curl/socket/YRC
3、不适合大计算量任务、长时间执行的任务 由于PHP的动态特性,PHP不适合去做常驻进程,和去处理大计算量任务,一是内存溢出问题,二是CPU使用问题
也就是说,PHP不适合CPU密集型应用程序。
PHP约定默认超时时间为30S。
综上,我们使用PHP,就是看中PHP在web开发上的随写、随测、随时上线的特性。 更多时候,对于整个系统架构来说,更多的核心是在数据分布式、缓存命中、负载均衡、CDN、业务逻辑、安全这些模块上。
所以,如果可以,就使用PHP吧,实在不行,OK,换强项的语言或解决方案,就这么简单。
对PHP的质疑: 1、PHP真的不适合开发企业级web应用吗? 架构、架构,适不适合企业级,不是开发语言说了算,而是整个架构设计。
在合适的地方使用合适的东西,在合理的地方使用能最优势的东西。
业界很多案例说明,不是我们应该使用哪个开发语言,而是哪个更适合我们的需要。
百度为什么有大量模块从C迁往PHP?
淘宝为什么从LAMP架构迁往JAVA?
新浪微博日均十亿的PV,为什么使用LNMP?
2、PHP真的性能差吗? 开发语言一定程度上,是不会最先达到性能瓶颈的。具体参照大话PHP之性能
3、PHP真的不适合职业发展吗? 很多童鞋担心选择了PHP,会不会马上走向职业发展瓶颈,还是那句话,作为开发,语言只是工具。
这些你真的都懂了吗?PHP的ZE、ZM、COW、设计模式、LB、CDN、LRC、RPC、SOA、分布式、CACHE、Restful、fastcgi、LOC等等
总之,选择她并喜欢她吧,写有灵魂的代码和程序,让世界因此而不同。
//------------------------------------------------------------------------------------
选择的比较语言:Java、.NET、C/C++、PHP、Python、Perl
以上均属于服务器端开发语言,其中Java、.NET、C/C++属于静态编译型语言,PHP、Python、Perl属于动态解释型语言
1、Hello world注:假设你已经配置好了各种语言开发环境[PHP]hello.php<?php echo 'hello world';?>#php hello.php[C]hello.c#include <stdio.h>int main(){ printf("%s\n","hello world");}#gcc hello.c -o hello#./hello[Java]hello.javapublic class HelloWorld{ public static void main(String[] args) { System.out.println("Hello World!"); }}#javac hello.java#java hello//java 后来出来了JSP,其实是简化了Servlet,来提高Web开发效率[C#]hello.csusing System;// A "Hello World!" program in C#namespace HelloWorld{ class HelloWorld{ public static void Main(string[] args){ Console.WriteLine("HelloWorld"); } }}# csc Hello.cs# Hello//语法很类似Java,它有着不错的组件对象模型COM的特性,C#继承类用:冒号。//注,C#是一个语言,.net是一个平台,上面支持用C#或者VBdotNet写代码。asp同jsp样,用来写动态网页的。[python]hello.py#!/usr/bin/env pythonprint 'Hello World' //python 是一种面向对象的脚本语言,语法没有大括号,主要靠缩进实现代码块,有些人认为这样的结果清晰,明了//主要应用于系统管理和Web编程,包括3D游戏开发等[Perl]hello.pl#!/usr/bin/perlprint "Hello, World!\n";//perl 被更多的用于系统管理的脚本语言,用来结合 或者 替代shell作为系统管理的程序语言//perl的优势在于文本处理(强大的正则表达式,PHP就是兼容perl的) 和 数据库处理</stdio.h>
Copier après la connexion
------------------------------------------