PHP到底有多糟糕?
php是web开发第一语言,这已经是坐稳了的事实,因为使用简单,工具完善,开发效率高等优点为它积聚了大量的粉丝,号称世界上最好的语言。 然而,就算是世界上最好的语言也有缺陷,下面我挑几个php语法层面不那么好用的特性吐槽下。
变量面前的美元($)符号
我想不明白当初php语言的设计师是怎么想的,为什么非要在变量名面前加上这个美元符号?每次我书写变量时必须要按一下shift +4键,用其它语言可以很流畅的写代码,在php中却老是被按这个shift打断整个过程,这除了能给程序员带来麻烦,我实在看不到有其它一丁点的好处。网上流传着的说法好像是因为带美元符号代码解析起来更容易, 性能更好。但是解释类型的语言又不只有php ,为什么其它语言就不用让程序员打这个讨厌的美元符号。每天看着满屏的美元符号,我口袋里的钱也没见多一分呀。
访问对象成员要使用箭头符号
明明按一下点号(.)就可以方便快捷的搞定的问题,却非要使用简单符号(->)来代替,真的是借我一百个脑袋也想不明白php设计者在设计这个特性是什么逻辑。难不成是因为php解释器最终会把php的代码转换成c代码执行,而c中访问指针的成员就是使用箭头符号的。如果是这样那显然是php的设计者们偷懒了,难到不能在转换成c执行的过程中多一步将点号转换为箭头符号的过程吗?不要告诉我又是因为性能问题而办不到,他们就不能为程序员想想?
数组即能当列表也能当字典
写一个函数,返回一个数组类型,但是在函数的外面,鬼知道这个数组是一个list还是一个map?写php代码不知道被这个特性坑过多少回,如果是别人写的函数, 又没有注释,那非得跑进函数里看个明白才知道应该这么样使用这个函数才是安全的。难到就不能把array拆成两个独立的类型分别代表list(列表)和map(字典)吗?这能为程序提供很大的便利,写的代码也更加不会出错。
匿名函数使用外部变量必须使用use关键字导入
这个特性不能说完全没有优点,对于代码的可维护性还是能起到正面的作用的,因为这么做能让我知道我在匿名函数体里面对于外部会有哪些依赖,让代码更可控。然而,这种写法真的是非常的不方便,每次写lambda时,要用到外部的变量时,都要使用use导入,把代码搞的看起来很臃肿,而且,因为其它语言没这个限制,习惯已经养成,所以每次都会忘记使用use导入,导致代码出错,增加排查问题的时间,这真的不是什么好玩的事。
用include导入文件
当把代码模块化时,然后在其它文件中使用,每次都需要使用这个include把文件导入进来,而且还要考虑路径的问题,在结构复杂的项目中,非常让人蛋疼。而像Java和Python之类的语言中,代码管理机制设计的非常好,想用什么import进来就可以了,根本不用考虑路径啊,文件名大小写啊之类的问题,能大大的提升开发效率。虽然,有框架可以解决这类问题,但毕竟是外部实现,使用起来总归不是那么顺畅。这也算是php一个比较大的毛病了。
总结的这五点算是php中存在问题的典范了,希望php团队能加把劲,把这些问题在未来的版本中优化掉,让开发者写代码时有更好的体验,更高的效率,让世界上最好的语言名副其实
匿名函数
伪类型:mixed,number,callback,void,
数据类型转换:int,integer,bool,Boolean,float,string,array,object,自动转换(值转换)
数据类型判断:is_bool,is_float,is_integer,is_object,is_array,is_string,is_resource,is_scalar,is_null,is_numeric,gettype,settype
引用文件:require,include,require_once,include_once,作用(布局,包含公共文件),文件载入原理(加载非执行,将编译后的文件加载),require和include的区别,文件返回(配置文件)
终止脚本:return,exit,die
载入文件路径:绝对路径,相对路径(./,../,/),文件载入的相对路径问题
字符
串相关函数:strlen,substr,strtolower,strtoupper,strrev,strpos,strrpos,strchr,strrchr(获取文件后缀名),trim
时间相关函数:time,date,strtotime,microtime
数组:概念,使用数组原因(变量关联),PHP数组特点(没有数据类型,数组下标可为字符串[不能使用for循环遍历],数组长度可变不会溢出),数组定义(array,[]),数组不能直接echo,数组长度(count,遍历),foreach(原理:赋值+指针下移)
二维数组:定义,语法,二维数组遍历,关联二维数组,遍历
Each+list:each(语法),list(语法,只能获得索引数组元素,按照索引顺序赋值),each和list组合遍历数组,each与foreach区别(foreach原理,each原理)
数组相关函数:key,current,next,prev,end ,reset,array_keys,array_values,数据结构模拟(array_shift,array_unshift,array_push,array_pop),字符串分割(explode,implode),array_walk_recursive(回调函数,按址传递)
数组运算:+,array_merge
数组比较:==,===
其他函数: range,array_rand,shuffle
SQL注入:原理,解决方案(addslashes,magic_quotes_gpc),公共函数(array_walk_recursive对$_POST转义)
数组算法:排序(冒泡,插入,选择,快排),查找(自定义查找,二分法)
表单传值:网站目的(数据管理:收集,整理,存储,发布),收集(表单实现),数据传递(url,form),传值方式(get,post)
数据接收:$_GET,$_POST,$_REQUEST,数据处理,$_REQUEST不值得信任(覆盖,request_order,variables_order)
点击行为判断:isset($_POST[‘submit’])/empty()
自动配置全局变量:register_gloabals
复选框使用:[],入库(字符拼接),显示复选框信息(checked),批量删除
文件上传:概念,难点(浏览器端,服务端),流程(表单post,enctype=’multipart/form-data’,PHP配置file_uploads,配置项说明(file_uploades,upload_max_filesize,post_max_size,upload_tmp_dir)),文件上传流程(本地选择文件,提交,文件发送到服务器临时目录,转义临时文件)
PHP处理:$_FILES,$_FILES说明,文件移动(copy,move_uploaded_file),验证文件类型(MIME),文件重命名(唯一性,可识别区分)
上传函数封装
多文件上传:数组,$_FILES处理
有数据显示,全球前100万的站点中,有超过70%的站点是使用 PHP 开发的。面对如此流行的编程语言,我们如何才能更有效率的学习?今天特意从GVP(Gitee Most Valuable Project)中精选6个和 PHP 相关的项目,看看我们的老司机是如何用 PHP 高质量、高效率地开发,同时也希望大家能够从这些优秀的项目中有所收获。
1.项目名称:BBS论坛系统 DiscuzX
项目简介:
Crossday Discuz! Board 论坛系统(简称 Discuz!论坛,中国国家版权局著作权登记号2006SR11895)是一个采用 PHP 和 MySQL 等其他多种数据库构建的高效论坛解决方案。对于站长而言,利用 Discuz!均能够在最短的时间内,花费最低的费用,采用最少的人力,架设一个性能优异、功能全面、安全稳定的社区论坛平台。
卓越的访问速度和负载能力。
强大而完善的功能。
国际化和标准化的产品架构。
周密的安全部署和攻击防护。
持久的创新和广阔的前景。
项目地址:
http://gitee.com/ComsenzDiscuz/DiscuzX
2.项目名称:IBOS 开源 OA 协同办公管理
IBOS 是一个基于PHP开发、Yii框架、免费开源的,快速、高效的协同办公管理系统,最新的 IBOS 为协同办公应用开发提供了强有力的支持,这些支持包括:
复杂的用户组织结构管理支持。
灵活和完善的角色权限控制体系,权限粒度支持到方法的权限设置。
实用的功能和完善的插件机制。
模块化的功能应用机制,可单独安装卸载单个应用。
云平台支持-提供了对新浪 SAE 平台和本地环境双重支持的选择,具备“横跨性”和“平滑性”,支持本地化开发和调试以及部署切换。
缓存支持-提供了包括文件、数据库、Memcache、Xcache、Redis等多种类型的缓存支持。
http://gitee.com/ibos/IBOS
3.项目名称:轻量级 PHP 开源接口框架 PhalApi
PhalApi,简称π框架,是一个 PHP 轻量级开源接口框架,专注于接口开发,致力让接口开发更简单。
致力于快速、稳定、持续交付有价值的接口服务。
关注于测试驱动开发、领域驱动设计、极限编程、敏捷开发。
有众多的扩展类库,与更多开源项目一起提供高效便捷的解决方案。
支持 HTTP、SOAP 和 RPC 协议,可用于快速搭建微服务、RESTful 接口或 Web Services。
http://gitee.com/dogstar/PhalApi
4.项目名称:开源ERP PSI
PSI 是一款基于 SaaS 模式(Software as a Service 软件即服务)的企业管理软件。PSI 以商贸企业的核心业务:采购、销售、库存(进销存)为切入点,最终目标是行业化的 ERP 解决方案。
http://gitee.com/crm8000/PSI
5.项目名称:网站管理系统 sentcms
SentCMS 网站管理系统(下文简称 SentCMS)是一款简单易用的网站管理系统,SentCMS 继承了 thinkphp5.0的优秀品质,秉承“大道至简”的设计理念。SnetCMS 为网站建设而生,为网站建设减少90%的代码编写,只需前端设计师就可以设计出完美的网站,而如此完美的系统还是完全开源的。其主要特性为:
全新的路由体系,完美的路由解决方案。
全新的系统架构,采用 thinkphp5.0内核框架。
完善而健全的会员体系。
健全的权限系统,权限细化到界面上的按钮和链接。
漂亮的后台界面,后台界面采用世界领先的前端框架 bootstrap,自适应的体验。
简单易用的标签体系。
便捷的文档系统,无需程序即可设计出完美的模型,做出完美的网站。
http://gitee.com/sentcms/sentcms
6.项目名称:重构的高性能版 thinkphp5
ThinkPHP5在保持快速开发和大道至简的核心理念不变的同时,PHP 版本要求提升到5.4,对已有的 CBD 模式做了更深的强化,优化核心,减少依赖,基于全新的架构思想和命名空间实现,是 ThinkPHP 突破原有框架思路的颠覆之作,其主要特性包括:
基于命名空间和众多 PHP 新特性
核心功能组件化
强化路由功能
更灵活的控制器
重构的模型和数据库类
配置文件可分离
重写的自动验证和完成
简化扩展机制
API 支持完善
改进的 Log 类
命令行访问支持
REST 支持
引导文件支持
方便的自动生成定义
真正惰性加载
分布式环境支持
更多的社交类库
http://gitee.com/liu21st/thinkphp5
这也许,不,就是PHP世界中最好的日志组件—— Monolog
所有的 PHPer,请站在巨人的肩膀上。随着 Composer 的普及,PHP 组件化开发思想越来越深入人心,我们没有必要重新自己打造轮子,只要确定需求和目标,设计好软件的架构,就大胆地使用那些优秀的第三方组件或者框架吧,这样能极大提高效率,而且绝大部分情况下,使得代码更加健壮、高效和可控,因为经典的组件和框架都是经过无数人测试的,代码质量一般都很好。这一系列的文章,将每次为大家推荐一款高质量的 PHP 组件或者库,供大家参考使用,希望对大家有用。
002 Monolog 日志组件
简要评价
日志记录是编程开发中最基础的需求。但不知道什么原因,PHP 语言并没有提供一个内建的日志接口,于是就出现了很多第三方的日志库。
Monolog 是我用过的最牛逼的日志库,功能异常强大,可以将日志到发送到文件、sockets、邮箱、数据库和各种网络服务上。目前很多知名的开发框架如 Symfony 、Laravel、 CakePHP 等都内置了monolog。
在 Monolog 中,每一个 Logger 实例都有一个通道和处理程序栈。当添加记录到 Logger 的时候,它会遍历程序栈,处理日志记录需求。简单地说,就是我们可以创建多个处理器,比如将日志发往邮件的处理器、写入磁盘的处理器、存储到数据库中的处理器等等,然后灵活地组合使用,基本上能够满足你的一切日志记录需求。
如果还有很多特殊的记录需求,比如公司内部的一些私有服务,也可以很方便地编写插件来扩展 Monolog。
总之,有了 Monolog,日志这一块就基本不用自己写代码了。我们也强烈建议开发者不要重复造轮子,这样可以很好地提高开发效率。
下载安装
Monolog 完全遵循 PSR 标准,可以使用 Composer 安装管理。
安装后,基本用法如下:
详细用法请参见其官方文档,地址是:http://seldaek.github.io/monolog 。
喜欢闲适安静的生活,懂一点计算机编程,懂一点统计学和数据分析。(爱编程爱统计)