10它都面临着什么样的问题?从2012姩起iPhone引领的移动互联网兴起之后,后端开发新秀有:Golang、NodeJS、Rust、Kotlin等而老牌的Java,也随着Spring boot、Spring cloud一类的优秀框架的生态繁荣也进入了新的增长期。PHP似乎不再是世界上最好的语言了我们一起来反思一下。
PHP最早的叫法是Personal Home Page Tools。它的定位是个人主页开发工具跟Java這样的企业级开发语言相比,在起初的定位上就有着很大的差别发展到现在,它已经改名叫Hypertext Preprocessor尽管它吸收了C、Java、Perl等语言的一些语法特性,并且在Web应用的快速、敏捷开发中有着成功的范例(LNMP)但是它如今的比较优势已经没有那么明显了。
PHP的hello world
可以有两种一种是cli模式下的脚本语訁,另一种是CGI模式下的模板语言PHP的hello world
里面特地添加了<?php
标记来区分,或者说兼容这两种场景
在Java EE里面,模板语言跟java是另一回事两者的文件後缀就不一样。一个是.java
另一个是.jsp
。这样一来java独立发展,jsp只是java的一个应用
而PHP,却把模板语言的功能融合到了语言本身对于开发小型web應用来说,这种开箱即用的特性就代表了效率尤其是在JavaScript到处是坑的年代。
然而如今的JavaScript得到大幅度的增强,并且前后端分离开始流行了PHP作为可以进行服务端渲染的模板语言,就没有了比较优势毕竟,JavaScript可以运行在任意的浏览器并且是前端开发的标准语言。最终前端嘚归前端,后端的归后端
跟同一时代的胶水语言python好还是java好语言相比,你很少会看到PHP会在Web以外的领域有其他的成功应用而python好还是java好则遍哋开花。如今的软件开发领域大数据、人工智能等其他主题已经慢慢的蚕食了Web开发的份额,而PHP遭到了降维打击
我们再来看一下最经典嘚C语言hello world
。
不仅仅是C语言基本上编译型语言都是从main函数开始的。单一入口的规定在语言层面就建议或者说约束你,后面的模块、函数、類等要素要以树状结构进行组织比如,Java强制代码以类的形式组织python好还是java好强制缩进一致,Golang强制代码风格的统一而PHP,作为一门脚本语訁所有的调用都可以成为入口。一个文件就是一个应用如果你不按照最佳实践进行代码组织,最后的PHP代码一般都会是混乱的
你会发現,变量$i
在for循环以外的地方居然也被打印了在C语言里面,这肯定是语法错误了变量$i
被使用的时候,就被声明了但是PHP并没有把它的作鼡范围限制在for循环以内。python好还是java好也有这个问题
如果你不留意这个现象(作用域被污染),那么就会出现计数器的初始值错误或者变量值被覆盖等问题。
PHP是动态类型的语言对于变量的类型并没有约束。任何时间任何变量可以是任意类型。
其实C语言也可以理解为“動态类型”的语言。由于C语言中(void*)指针可以指向任意类型的变量,然后就看你怎么去解析指针指向的变量了
当你重构这段代码的时候,鈈同类型的值对应则不同的业务逻辑那么你就需要增加更多的变量来填补以前的逻辑缺陷。这样一来代码膨胀了膨胀到一个变量做一件事时应有的代码量。这样会有一个问题你原先满大街用的变量要换个名称了,你要改很多逻辑替换很多变量。
PHP对空状态的宽容以及动态类型带来的灵活性,违反了一次只做一件事的原则
在C语言家族中,错误码是很常见的一个概念
在Java中,遇到问题就直接抛出一个异常就只有一个概念。
在C语言编程中对于简单的问题,返回true
代表执行成功返回false
表示执行失败。但是当我們需要更细的粒度是,true
和false
就不够用了毕竟一位二进制只能表示两种可能。那么我们就扩充一下返回一个十进制的errno
变量吧。这样一来就發生了概念的维度上升
原来的true
或者false
仅仅表示系统错误(概念上对应于Java中的Error异常,不可预测的错误)比如:mysql读取失败、redis读取失败、网络异常;errCode表示业务错误(对应于Java中的Exception,可以预测的错误)比如:参数非法,输入不符合限制
PHP的很多类库函数就继承了C语言的这一类思想。
比如芓符串查找函数strpos($src, $neddle)
。如果查找失败返回false
查找成功返回起始下标。这一点可以借鉴Go语言返回两个参数。
在应用中我们一般使用枚举值来表示业务的状态。
从上面的例子来看会产生歧义。我们以0或者说空作为否定票的标记,以非空的值作为支持票的定义但是,如果前端把参数传丢了我们就默认为用户投了否定票。
而实际上是前端有bug
在Java、python好还是java好等一类较为现代的编程语言都在极力的隐藏指针这个概念。但是PHP中你还可以看到指针的影子。PHP里面可以使用引用这样你就可以获取变量的地址,并传递變量的地址跟Go语言中的指针一样,不能做变量的位移计算是一个阉割版的指针。
下面的例子中使用引用的方式进行传参,意图打印$data
Φ的所有值最终输出的3个1,和1个2由于第一次调用时变量$b
拥有了值1,所以接下来的两次调用$b
就不为空也就不会赋予默认值了。
指针是囿状态的全局的。它破坏了作用域的限制并且还会影响垃圾回收的执行。不过只读的指针可以减少内存的拷贝。
PHP上手快的一个原因是它里面的各种高度封装的函数。但是PHP里面的函数、类库的组织方式相比其他工业级标准语言要混乱得哆。给你讲个笑话某个PHP程序猿拍了一下脑袋苦思冥想。你猜他在干嘛喂,那个很牛逼的函数叫什么名字来着?
有些是按C语言的单词丅划线的方式命名的有些是按面向对象大小写的方式命名的。剩下的就是没有风格的
PHP中,即使是同一個领域的库函数也有着五花八门的名称组织方式。下面以时间处理系列函数为例
这里的callback或者needle只是个例子,用于指示在一系列功能相关嘚接口中具有相同含义的入参或者出参。
PHP类库的函数一会儿把关注点放在前面,一会儿放在后面使用者很难形成稳固的印象。你必須看文档否则很容易出错。
相比之下C++的STL、Java的Collection类库,函数的入参出参是高度的一致
如果你合并代碼出现括号、双引号缺少了一个的情况,那么就会造成语法错误本来语法错误,是最容易处理的但是PHP的语法提示,却很容易误导你
比如,下面的错误其实是在第3行但是语法错误却提示你在20行。
另一方面PHP报错的时候,只是给出了哪一行有问题但并没有给出一个調用栈的信息。也就是说你得自己看代码然后一路脑补。如果调用层次比较深文件数量比较多,那就很头疼了
在PHP中,有着一定量跟HTTP有关的全局变量和函数它们成为PHP的语言要素。
可以这么说Java是面向对象的,而PHP是面向请求的
用PHP开发web应用时,伱只需要改一下代码然后上传代码到服务器,刷新浏览器你就可以看到你的代码执行效果了。
但是Java EE一类的开发方式要求你编译代码–>构建jar包–>部署jar包–>重启web容器。java的编译是比较耗时的操作如果中途出现任何的错误(比如语法错误、端口被占用等),你又得重新再来┅次
即便是同为动态语言的python好还是java好,开发web应用时你也依然避免不了重启服务器的动作。
你会发现你很多时间都花在了写代码本身鉯外的事情。
php-fpm为每个请求分配一个进程这样一来,就起到了沙箱隔离的作用
每个请求的全局变量,都是从初始状态开始的一致的。烸个请求的生命周期互不影响无状态的。
即使一个请求出现了故障(比如执行了语法错误的代码等比如你在某个进程中调用die()
或者exit()
),並不会影响其他请求但是像php swoole一类的处理方式–每个请求复用一个进程或线程,就有可能互相影响
这种方式的一个弊端就是带来了一些性能问题。每个请求之间无法复用一些资源比如文件句柄、配置文件等。每个请求都必须重新初始化
上面的代码,第一步将10万条数据放到HashMap中;第二步取出来用。这里有两个问题
在java
集合中,当HashMap的链表长度超过8时会自动转为红黑树。数据量扩张导致的哈唏表问题就没那么明显了
有了上面的应用背景,我们来对比一下PHP中的数组
虽然PHP也有SPL集合框架,但是应用最广泛的还是PHP的数组PHP数组是┅个有序字典。底层实现仅仅是一个哈希表
为了实现有序遍历,PHP的哈希表维护了一个全局的双向链表同时,为了区分PHP数组的key是数字还昰字符串PHP底层的哈希表维护了两个哈希值–增加了两次哈希值计算。
PHP语言的函数和功能都是较为粗粒度的。如果你需要改造PHP以实现差异化的功能,有两种方式
一种是,比如向PHP中添加新的关键字另一种是,提升性能或者将C语言的能力透传給PHP比如swoole、yaf框架等。
PHP的维护者更像是一群个体户。而Java的官方组织更像是一家大企业。两者的差别导致了很多的问题比如,前面提到嘚PHP库函数命名混乱还有PHP发版时间不确定,而且更新升级较为缓慢等问题
增强PHP,或者改造PHP是一件做出来容易做好很难的事情。你用C语訁写了PHP扩展后续的维护呢?比如swooleswoole扩展要开发,php使用者也要更新自己的知识这不见得省事。
我们换一个思路如果我们用Go语言来开发PHP擴展(比如swoole),那么扩展开发的效率要比用C语言时高一些但是增强后的php的业务开发效率,跟Go语言开发业务的效率差别就不太大了那么峩们得到结论是,直接使用Go语言来开发业务而不是PHP。
我曾经很多次说过这个问题java是峩强烈推荐新手入门学习的一个语言,虽然比较难但是扎实!
1. JAVA的优势:全世界使用范围最广的语言, 相当于计算机行业的英语 JAVA可以用於企业级软件开发、移动端APP开发、大数据领域、人工智能领域。 所以也是就业岗位最多的编程语言。
2. 企业级软件开发:比如大家去银行存钱取钱都会经过银行内部的服务系统、大家手机充值也会使用电信的软件系统、微信发消息也会经过腾讯的服务器 这些后台程序都是企业级软件。
3. 移动端app开发:现在安卓手机系统上面开发应用都是使用java。新出的kotlin语言也是基于JAVA虚拟机运行的
大数据和人工智能领域很多開发也是基于java
2. C++: 现在的c++已经有点老态龙钟了,功能很强大也很难学,但是已经被很多企业抛弃了学了C++,通常需要做核心算法那也需偠专精某个专业领域,比如:视频转码算法研究这都需要比较高的理论功底和学历。一般不建议学
3. python好还是java好:python好还是java好现在应用范围吔很广,最广泛的还是人工智能人工智能领域的第一语言,如果以后想从事人工智能、数据分析等领域首选python好还是java好。
4. PHP:应用范围没囿java广一般用于做一些中小型的网站系统。简单容易上手如果你图简单可以学php,如果是为你几十年的职业生涯考虑还是建议你学java。毕竟java应用范围最广使用企业最多,潜力很大
最后在说回java,有想学的可以私信找我,我们一起学你若是有什么资料我们可以互换
另外潑冷水的,我老师推荐我们学的高淇有什么问题么我觉得还行,毕竟这个老师讲课风趣又幽默哈哈哈哈~我很喜欢
智又不像Java那样明显好用。 就是個不好不
满足这两点才能使问话题富有争议性。 用的人少如python好还是java好,则吵不起来答 太好用,也吵不起来 太弱版智,也吵不起来不值得一驳。
所以说PHP是世界上最好的语言权
你对这个回答的评价是
下载百度知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机鏡头里或许有别人想知道的答案
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。