在2020年12月26日,PHP 8.0.0 正式版发布了,伴随这圣诞节的钟声,PHP已走过了25个年初(v1版发布于1995年6月8日) 。作者我使用PHP也有7年有余,固然,我知道有这么一句话——PHP是天下上最好的语言 
这话半是称赞,半是揶揄,那么PHP到底好在哪。 
先说结论: 
 
- 万物皆 hashMap
 
 - 热部署
 
 - 和C/C++相似的语法
 
 - 开箱即用的web环境
 
 - 区别 字符拼接,算数+ 运算符
 
  PHP历史 
 
我用过C++, Java, PHP, Javascript,Python, , Go(排名就是我认识他们的顺序) 这些语言,对他们不敢说醒目,也算了解,今天我主要谈谈PHP。 
诞生2020年版号脚本语言热部署跨平台Web生态C++1983v20否否差一样平常Java1995v15否否好非常丰富NodeJS2009.5.28v15是否好非常丰富Python1991.12v3.9是否好丰富PHP1995.6.8v8是是好非常丰富Ruby1995v3是否好一枝独秀Groovy2007v4是是好一样平常Perl1987.12.18v5是否一样平常少C#2002.1v8否否差->一样平常一枝独秀Go2008v1.15否否好丰富 
 
从从这个表格来看。 PHP也算是一门老语言了。基本和Java同样大了。可以看到 C++,Java,Node版本号很高,这侧面阐明开发者对这门语言的热情,以及在这门语言上花的时间。而PHP中规中矩吧,在2021年初,PHP 正式版发布了 v8,PHP的使用者非常广泛,并且还诞生出一些类PHP语法的假造机——HHVM,以及能运行PHP的jvm。 
也诞生出了很多PHP拓展来补充性能短板——Opcache、Phalcon、swoole等。可以说PHP生态是百花齐放。 
从语言排行榜来看: 
 
排行榜参考: 
https://www.tiobe.com/tiobe-index/www.tiobe.com 
 
 
HashMap 
 
说说万物皆是——hashMap。在编码过程中,为了保存不同实体、对象,会用到数组,列表,对象,字典等。这些在PHP的底层实现以及的运用当中。同等用php array 来保存。使用过程中,phper不需要思考到底要用什么样的数据结构,用 list、dict、还是map,齐备用 php array就行了,这使得phper心智负担小了很多,低落了上手门槛。当初我抱着《21天入门Java》时,看到容器一节,List、LinkedList、ArrayList、Set、Map、HashTable我都懵了,这都是啥。而PHP就是数组,作为小白用好数组就能干活了,当你需要用Map时,指定key就好了,当你需要用到Set时,array_unique就好了。概念简单,学习曲线平滑,当你需要深入时,你去看看array相关的函数就会有新的见解。 
而透过PHP的源码,也可以看到array、k-v array、class 底层都是HashTable。如许的内存管理有点粗放(你都用脚本语言了,只要内存不泄漏,内存管理粗放点也没啥),但使得PHP的底层数据结构显得单一简便。相较于Python、Node这些脚本语言,PHP时在v7版本才从底层上引入Set、Map、Queue等数据结构,也不能说PHP没有数据结构、但想PHP如许的瑞士军刀般array,是其他语言少有的特性,这也是让我、以及很多phper对PHP这么语言难以格式的原因之一。 
PHP Data Structures : 简介 - Manualwww.php.net 
热部署 
 
当我们在调试php-fpm程序的时候,改了代码,刷一下页面就能看到效果了。如许的简单直观的Debug体验,也是PHP独有的,编译性语言C/C++,Java 你得点一下rebuild 吧,固然你说有宇宙最强IDE的加持,改了代码自动编译,编译的时间也不断吧。在看看Python、Node,你不点个restart、也得等npm重新编译是不,这个在线debug服从就比php-fpm慢了不少。 
试想一下作为一个编码初学者,这种快速、所见即所得的调试体验黑白常棒的,你搞别的语言的,你还的配置一下IDE,或者改改package.json,作为代码初学者,哪知道什么叫断点调试,file watch,我就知道print(). (PS:很多PHPer写完一个function了,隔壁Javaer还在配置xml)。 
好继续说热部署,这个是运维概念。就是线上PHP服务需要发布更新,只需要把代码复制粘贴上服务器就完事了。这种部署体验,任意找个练习运维都会,直接ftp就能搞定。要是Java、Node,Python这种,普通运维就是:1.代码打包,2.代码上传到线上,3.重启服务。如果是直接重启服务肯定会有停止时间,作为一个靠谱的运维,你得平滑重启。这一点就增加了很多工作成本。 
固然这一切是有代价的,php-fpm的热部署是建立在重复编译之上的。随着这个计算机性能的进步,编译时间基本不再是系统的瓶颈。DB、IO反而是耗时大户。如果真要避免重复编译问题,使用php-cli模式也可以办理,用惯了php-fpm模式的我,换php-cli模式,调试的第一感觉就是慢。 
php-fpm 框架,每次一次请求都是 compiler、init、 dispatch、 controller,会经可能优化这条流程。而php-cli 框架,compiler、 init 只会有一次,然后让每一次请求的 dispatch controller 很快很轻,这就会使得 init 这块 的逻辑做的比较重,所以改了代码重启会很慢。  
类C语法 
 
我在大学入门编程语言就是C/C++,当我看到PHP时,除了没有 main 函数,变量多了个dollar符号,其他语法都差不多。画不多说之间看下语法对照表: 
语法对照C/C++(区分大小写)PHP(变量区分大小写)变量赋值char a = 'a'; /* 8位有符号*/ 
int a=10; /* 16位有符号*/ 
unsigned int a = 10; /* 16位无符号*/ 
short a = 10; /* 16位有符号*/ 
unsigned short a = 10;/* 16位无符号*/ 
long a = 10; /* 32位有符号*/ 
unsigned long a = 10; /* 32位无符号*/$i = 10; /* 变量以$开头*/ 
$pi = 3.14; 
$a = 'a'; 
$a = 'Hello!';if () {} else {}if (a == 12) ... else {};if ($a == 23) ... else {};switchswitch (expr){ 
case expr1: 
DoSomething; 
break; 
case expr2: 
DoSomething; 
Break; 
case expr3: 
DoSomething; 
Break; 
default: exprN; 
}switch (expr){ 
case expr1: 
DoSomething; 
break; 
case expr2: 
default: exprN; 
}forfor(expr1;expr2;expr3){ 
DoSomething; 
}for(expr1;expr2;expr3){ 
DoSomething; 
}foreachforeach($data as $key => $item) { 
doSometheing; 
}whilewhile(expr1) 
{ 
}while(expr1) 
{ 
}do {} while;do 
{ 
}while(expr1);do 
{ 
}while(expr1);函数int max(int num1, int num2)  
{ 
// 局部变量声明 
int result = 2; 
return result;  
}function main() { 
return 0; 
}指针int var1; 
print(&var1);$a = 2; 
$b = &$a;类class Box 
{ 
public: 
double length; // 盒子的长度 
double breadth; // 盒子的宽度 
private 
double height; // 盒子的高度 
};class PhpClass { 
public $age; 
private $sex; 
public function getAge () { 
return $this->age; 
} 
}类属性、方法Box b = new Box(); 
print(b.length); 
Box *b2 = &b; 
printf(b.breadth);$pc = new PhpClass(); 
$pc->age; 
$pc->getAge(); 
以上表格参考自: 
 
 
C、Delphi和PHP的基本语法对照表 - pchmonster - 博客园www.cnblogs.com 
PHP底层就是C写的,可以说学了C,再来看PHP,这不就是C的脚本语言么,在广大的C/C++大学入门教诲的基础上,入手PHP时非常容易的。(所以、php国内那么火、谭浩强要付主要责任!) 
开箱即用的web环境 
 
 
我刚开始接触PHP时,没有尝试自己配置http代理,直接下载的集成环境——wamp,在windows上装好,PHP、Apache、MariaDB都能用了,写个 
echo "Hello World!"; 访问网页就能看到效果。 
总之配置一套php开发环境黑白常快的,配合Windows,双击exe、一路点点点就能搞定。如果你要写个Java还得配置下环境变量吧,还得了解下什么是环境变量。写C#,先下个几个G的宇宙最强IDE。这个时候入门的小白稍微碰到点阻力就有可能打退堂鼓,如果阻力多一点,我们又痛失一位程序员。 
我估计有人要说Node和Python也是开箱即用,对,它们俩也不差。 
再说下Serverless,最近炒的比较火的一个概念,我想说这不就是php-fpm。Serverless特点: 
无需devops,PHP基本上不怎么让运维费心,有问题重启,代码发布ftp,某段调试代码exit()写了忘了删, php-fpm不会全部死掉,这个历程死掉后会自动fork新的历程(固然你把exit写在index.php 第一行,那我可没法了啊)。 
关于第2点,php-fpm 热部署特点就是。 
第3点,如果你配置了 pm = dynamic,请求量大时php-fpm会自动fork更多子历程来处理请求,这就是动态扩容。 
区别 字符拼接,算数+ 运算符 
 
作为弱类型语言,大家都会碰到的问题。隔壁javascript 已经被这句代码搞得焦头烂额了。 
var re = '1' + 1;而PHP直接将字符串拼接,与算数加,两个操作区分为两个语法。就完全避免了这个问题。 
总结 
 
PHP的学习曲线平坦,让使用它的人一蹴而就。PHP的语法简单,数据结构单一,低落了使用者心智负担。PHP不失为我心中最好的语言。 
原文链接:https://zhuanlan.zhihu.com/p/342838568 |