最近写了一段时间PHP,发现了不少以前没有注意到或者意识到的事情,写一篇记录分享一下。PHP进阶一定要注意这些事情。

用好PECL

PECL(The PHP Extension Community Library),PHP官方提供的PHP扩展库。这个主要可以解决社区和第三方提供的PHP扩展的安装问题。早些年看张宴老师的PHP编译部署的文档,生产环境的PHP扩展安装从那时起都是从网站上下载,然后自己编译安装。后来PHP版本升级后,原来文档里面提供的扩展包已经不能匹配新版PHP环境了。其实PHP一直都有PECL这个工具用来管理第三方扩展,使用起来非常方便。

在Linux/Unix/MacOS上,使用PECL是一件非常方便的事情。如果你的PHP环境是自己编译的,在PHP的安装目录的bin下会有pecl这个文件,把它软链到/usr/bin下面你就可以随时使用pecl了。以下给出两种软链它的方案,Linux发行版推荐使用alternatives工具。

我的PHP安装在:/usr/local/php-5.5.10

alternatives安装方式

alternatives --install /usr/bin/pecl pecl /usr/local/php-5.5.10/bin/pecl 1000

soft link安装方式

ln -s /usr/local/php-5.5.10/bin/pecl /usr/bin/pecl

注意你可能需要管理员权限才能进行此操作。

在Windows上同样可以使用PECL,但是不如Linux/Unix系统上那么无痛。有相当多常用的扩展并不提供编译好的.dll,而且要在Windows上自己编译PHP扩展,现阶段来看,称其为一场灾难也不为过。要做到VC版本、x86/x64、线程安全/非线程安全版本的完全匹配,一个版本的扩展至少要产生8~12个版本的DLL。

使用PECL非常简单,常用的命令包括list、search、install、uninstall。

list命令可以帮你查看当前PHP环境已经安装的扩展:

[root@dev2 bin]# pecl list

Installed packages, channel pecl.php.net:

=========================================

Package Version State

memcache 2.2.7 stable

mongo 1.5.1 stable

redis 2.2.5 stable

search命令可以在软件仓库中查找需要的扩展软件包:

[root@dev2 bin]# pecl search mongo

Retrieving data...0%

Matched packages, channel pecl.php.net:

=======================================

Package Stable/(Latest) Local

mongo 1.5.1 (stable) 1.5.1 MongoDB database driver

如果你要安装mongo的扩展,那么直接执行:

pecl install mongo

即可搞定,多简单!

需要注意的一点是,PECL并不会替你修改php.ini文件,所以使用pecl安装扩展后,请编辑php.ini文件增加配置使扩展生效。

拥抱PHP 5.3+

貌似很多国内项目还在坚守PHP 5.2,老项目的迁移抛开不说,如果你正准备进行一个新的PHP项目,那么请将你的默认PHP版本升级到5.3.8以上,推荐直接升级到PHP 5.5。为什么要这样做?首先是更加完善的面向对象支持,PHP 5.3开始支持命名空间,这一特性对现在社区的库和扩展来说是一项最起码的要求。如果你还打算继续使用PHP 5.2甚至更老的版本,那么恭喜你只能望Composer兴叹了(下面会告诉你Composer是个多么令人惊奇的东西)。另外就是新版本的安全性和性能会更好。(PS吐槽:总有人认为老版本更稳定或者给更安全,美其名曰经历过实战检验——这群人的万能挡箭牌。呵呵。)

PHP 5.3开始支持命名空间,同时也由此诞生了psr规范(什么是PSR?传送门)。有了这一特性之后,我们终于有了普遍适用的类和文件加载机制,再也不用关心使用类之前是否require过,或者费心使用各种框架五花八门晦涩的组件加载方法了。

PHP 5.4开始支持了数组定义的缩略写法,以前我们定义一个数组通常是这样的:

$array = array('a', 'b', 'c');

大家用JS就会发现这种写法其实不够简洁,于是PHP5.4开始支持了类似JS的这种写法:

$array = ['a', 'key' => 'val', 'c'];

另外,PHP 5.4开始,支持了方法参数的强制类型定义(以前只支持array),这对提高代码的健壮性和IDE支持有了很大帮助:

function test(PDO $pdo) {

...

}

当然,一些特性不再必要,或者受支持,请参考:

在PHP 5.5中,有更多的新特性被支持,比如empty开始支持表达式了,新版本现在开始支持yield关键字了。如果你对.net比较熟悉,那这个对你来说一定不陌生。

当然,一些特性不再必要,或者受支持,请参考:

使用Composer

Composer绝对是一个令人眼前一亮的东西,它更像是PHP的Maven。现在一门编程语言,得社区者得天下。Java的广泛应用,功劳肯定离不开数以万计的社区项目支持。你要开发一个模块,还继续自己先造轮子吗?No,Composer已经为你提供了数以万计的轮子供你挑选,现在要做的,就仅仅是从一些漂亮的轮子里面挑选合适的放在你的项目里,而不是写一些未经严格测试的代码就作为系统的基础类库。

关于Composer的介绍,请参考我之前写的一篇文章:传送门

做一件事情,现在只需要往composer.json中添加一个合适的库依赖,然后使用composer update,这些天降神兵的家伙就加入到你的项目中了。我现在使用了这样几个组件,通过composer安装:

Doctrine ORM – 一个PHP的ORM框架,下面会讲到。

php-resque、php-resque-scheduler – 一个PHP的后台任务处理框架、计划任务框架。

phpexcel – 老牌PHP处理Excel的组件

image – 一个PHP的图像处理库

我要做的仅仅是写几行类似胶水的代码,把这些类库粘接起来。其他的事情全部交给开源社区了:-)。

别被框架绑架

不能不说,如今PHP开发不整一个框架,都不算会写PHP。有那么多框架可供选择:Zend、Symfony、Yii、CakePHP等等,但是千万记得别被框架绑架。这句话有两个方面的意思,首先,别让框架把简单事情复杂化。PHP论性能不如Java,论语法糖不如C#,论灵活性扩展性不如Python、Ruby这些家伙,那为什么还用PHP呢。我觉得仅仅是因为,KISS原则:Keep it simple, stupid. PHP要实现一个功能很简单,可能Java搭建框架的功夫,PHP就已经交付了这个功能。开发迅速,维护简单是他的优势,别让框架把它搞复杂了。其次,如果一个设计,框架不支持,或者做不到,不要想当然的以为PHP也做不到,这就错了。别忘了你有Composer:-)。但是如果一个框架不能够很好的支持社区组件,那么是时候把它扫进垃圾堆了。

Doctrine ORM

这家伙实在是不得不说它了。按照我以前的想法,PHP存在ORM这种东西完全是找虐。用过了Doctrine ORM才彻底改变了我的想法(其实不得不提的是之前做了接近一年的Java,JPA、Spring Data神马的已经开始依赖了)。

新的项目使用了我自己写的SimplePHP框架(传送门到GitHub)。但是业务领域还是有一些复杂的。为了便于以后的开发和维护,也为了团队协作更加方便(关于领域和数据访问层的设计,请参考《企业应用架构模式》这本书。),我决定尝试一种PHP的ORM框架。在Composer上找了一下,发现Doctrine ORM使用最多,果断尝试一下。刚刚读完入门指南,我就立即发现,这货完全就是PHP版本的JPA,连API都非常接近。

$entityManager = EntityManager::create($conn, $config);

$product = new Product();

$product->setName($newProductName);

$entityManager->persist($product);

$entityManager->flush();

SimplePHP可以很好地兼容PSR-0,所以直接通过Composer安装,简单配置一下即可:

Conf/db.conf:

/* Doctrine */

return ['doctrine' => array(

'metadata_type' => 'php',

'metadata_path' => array(APP_ROOT.DIRECTORY_SEPARATOR.'Entity'),

'dev_mode' => true,

'db_param' => array(

'driver' => 'pdo_mysql',

'host' => '127.0.0.1',

'user' => 'public',

'password' => 'public',

'dbname' => 'test',

'charset' => 'utf8'

),

)]

我写了一个简单的工厂类,来帮助从配置文件产生EntityManager对象,在业务逻辑类里面可以直接使用:

$em = EntityManagerFactory::getManager();

来取得EntityManager对象。

项目开发证明,Doctrine ORM非常必要,它带来很多方便的特性,重要的是,Doctrine ORM性能也还不错。

通过注解方式配置的POPO(对应POJO),可以直接从领域模型快速建出,并且无需关心数据库建表,这一切都会有Doctrine的Tools帮你建立。甚至代码有了修改之后,都能自动地更新数据库表结构,简直不能更爽了,哈哈(PS:其实JPA一直都可以好嘛)。

基本上要说的也就这几点了,作为一点点经验分享给大家。

php中alight是什么意思,进阶PHP需要注意的一些点相关推荐

  1. c语言字母存储,字符串在内存中的储存——C语言进阶

    字符串在内存中的存储--C语言进阶 字符串是以ASCII字符NUL结尾的字符序列.ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.不过,并非所有的字符数组都是字符串,字符数 ...

  2. 【SQL开发实战技巧】系列(十八):数据仓库中时间类型操作(进阶)INTERVAL、EXTRACT以及如何确定一年是否为闰年及周的计算

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  3. 【SQL开发实战技巧】系列(十九):数据仓库中时间类型操作(进阶)如何一个SQL打印当月或一年的日历?如何确定某月内第一个和最后—个周内某天的日期?

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  4. 【SQL开发实战技巧】系列(二十一):数据仓库中时间类型操作(进阶)识别重叠的日期范围,按指定10分钟时间间隔汇总数据

    系列文章目录 [SQL开发实战技巧]系列(一):关于SQL不得不说的那些事 [SQL开发实战技巧]系列(二):简单单表查询 [SQL开发实战技巧]系列(三):SQL排序的那些事 [SQL开发实战技巧] ...

  5. 爬虫中之Requests 模块的进阶

    requests进阶内容 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三" ...

  6. 三万文字透视前瞻:区块链及隐私计算在传统企业中的技术认知与进阶思考

    作者  :招商局集团数字化中心  山金孝 声明:文章仅代表作者个人观点,与任何组织或公司无关 前言 区块链是一种分布式网络数据管理技术,其利用密码学和分布式共识协议保证网络传输与访问安全,并实现数据多 ...

  7. 在Horizon Workspace中配置Windows单点登录-进阶篇

    在上一篇基础篇里面,简单介绍了在Horizon Workspace 1.8中如何配置Windows单点登录.在这篇博客中,会继续介绍一些针对大规模虚机或者虚拟桌面部署的配置方式.这些配置方式可以保证用 ...

  8. 字符串在内存中的存储——C语言进阶

    字符串是以ASCII字符NUL结尾的字符序列. ASCII字符NUL表示为\0.字符串通常存储在数组或者从堆上分配的内存中.只是,并不是全部的字符数组都是字符串,字符数组可能没有NUL字符. 字符数组 ...

  9. 一文搞定JS中的DOM基础与进阶

    文章目录: 1.DOM简介 2.获取元素         getElementByld()         getElementsByTagName()         getElementsByCl ...

  10. c 给定字符串中查找_【C进阶】练习题(一)

    码字不易,对你有帮助 点赞/转发/关注 支持一下作者 微信搜公众号:不会编程的程序圆看更多干货,获取第一时间更新 1.打印杨辉三角 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 - 2. ...

最新文章

  1. C# WinForm中 让控件全屏显示的实现代码
  2. 研磨设计模式之 策略模式--转
  3. 摇杆控制方向原理_医用无油空压机的送料作用及工作原理
  4. Aop动态代理解决问题
  5. mysql主主备份_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
  6. MySQL 十大常用字符串函数
  7. Nginx压测性能优化
  8. net执行oracle的存储过程
  9. Server.ScriptTimeOut,Response.IsClientConnected
  10. docker搭建upload-labs
  11. C程序设计--命令行参数(argc 和 argv[])
  12. 房源租赁签约管理系统、租房系统、退租、续租、换租、转租、房源管理、招租系统、租期账单、合同管理、营销推广、租客系统、业主系统、web原型、业务流程 、门禁系统、Axure原型、rp源文件
  13. 开源:全球软件产业四大发展趋势之一(转)
  14. Distiller 安装时环境配置的一些可选项
  15. 中外三大院士领衔:​INSEC WORLD世界信息安全大会即将开幕
  16. 文件内容中显示(SOH、STX、ETX)
  17. 【RDMA】基于RoCE v1配置PFC (非讲原理)
  18. 基于点击量的趋势分析python_【Python数据科学实战项目】之 基于MovieLens的影评趋势分析详解...
  19. 教师管理助手平台有哪些功能特别好,使其非常受学生们喜欢
  20. Aplication的作用

热门文章

  1. 用JavaScript时钟特效
  2. mysql脏页处理方法_mysql脏页是什么
  3. 服务器cpu一直处于100%解决思路
  4. 2019 Multi-University Training Contest 6 1005 Snowy Smile —— 线段树
  5. defineExpose暴露
  6. 信息安全管理——仿射密码破解
  7. 从0到1:开启商业与未来的秘密
  8. 巨杉TechDay回顾 | 技术人的夏天 · 就是这么燃!
  9. 我的大脑越来越喜欢那些碎片化的、不用思考的文章了!
  10. 传统零售业务分析指标整理