PHP开发者的路书

时间:2022-04-24 18:35:33

初学者

作为初学者,通常情况下,我们都会买一本PHP教材,或者在网上看免费教程,这当然是学习的好途径。因为,这些书籍和网上的免费教程,基本上都是由浅入深的渐进式教学方式,基础知识居多,高级知识占少量的部分。这样,可以让初学者很快的入门,并且建立信心。

我的唯一的一本PHP入门教材是【PHP与MySQL程序设计】。一般的来讲,从这类入门书籍中,我们可以学会PHP的if、for、foreach、while、switch等分支、循环结构语法,学会灵活运用array这个在PHP中可以说是灵魂的利器,学会function,可以将代码模块化,到此,基本就可以写一些东西了。至于PHP中的很多函数,像字符串函数、数组函数等,书到用时再去查,也为时不晚。当然了,isset和empty这样的必知函数,写多了,就必知了。

入门之后

这个时候,可能需要了解一些书中提到的高级一点点的用法。

比如,取地址符【&】的用法,这个很好用。例如在foreach中,在遍历的时候,想去改变里面的值,在遍历结束后,要让list中的那个值确实的被改变,这就需要用到&。一开始的时候,我在用foreach时想改变其中的值而不能的时候,我会改成for循环,这就稍显麻烦,而其实,在foreach的代码上,只需要加一个&就可以了。

foreach($list as &$value) {
$value = 'changed';
}

这种引用参数的用法,同样适用在函数的参数传递上。至于为什么加上&和不加,有这样的区别,不是这里讨论的问题,在基础入门的书里,都会提到。

还有相对路径和绝对路径,以前看PHP框架,发现会出现很多 dirname(__FILE__);,不明所以,研究之后发现,不过是绝对路径。初学者常犯的错误是用相对路径去include/require文件,这种做法有着极大的隐患。至于何种隐患,不在此详细讨论,只是有的时候你会发现这块引用文件的代码,时而好用,时而不灵。

而我不久前在用ThinkPHP3.0/3.1版本的时候,执行一条数据库插入语句出错,在log文件中想看看出错的sql语句,竟然发现找不到此条log记录。于是,看Log.class.php源码,发现在save()中,把log打印写入到日志文件里的代码,用的是相对路径:

error_log($now.' '.get_client_ip().' '.$_SERVER['REQUEST_URI']."\r\n".implode('',self::$log)."\r\n", $type, $destination, $extra);

其中,$destination 是一个相对路径,该它改成绝对路径,就可以正常将log写入日志文件了:

error_log($now.' '.get_client_ip().' '.$_SERVER['REQUEST_URI']."\r\n".implode('',self::$log)."\r\n", $type, dirname(__FILE__).'/../../../'.$destination, $extra);

所以,要用绝对路径。

除此之外,还会有一些面向对象编程的高级一点点的知识,除了interface 和 abstract不常用以外,class、method、object、extends还有namespace。这些都很常用,尤其是现代的PHP框架,基本上都采用面向对象编程的思想,如果,此时还在用老旧的函数化的编程思想(仅对PHP而言),当看到一堆namespace命名空间,不知道该如何正确引用类的时候,就会晕菜的。

PHPer的圣经 - 通向更高阶的必经之路

目前,对于PHP开发者来说,有一本圣经,可以给你提供一条进阶之路。

英文版:PHP The Right Way

中文版:PHP之道

Composer - 包管理工具

相信在很多很多的PHP教程书籍中,都提到过PEAR这样一个东西,它是一个PHP的代码库*,我们可以从上面找一些现成的代码解决方案,来放到我们自己的项目中使用。可是,究竟又有多少人用过这个东西呢?反正,我是没用过。

但我在不久前,开始用 Composer 了,并且现在好些个PHP框架,都开始用 Composer 了,所以,我知道了它。至于Composer比PEAR好在哪里,由于我也是个初学者菜鸟,也不是很懂,反正照我的理解就是,你要用某个现成的代码库,如果此库又引用了另外的一个或几个库,而另外的一个或几个库又引用了另外的。。。没关系,你只需要 composer install someting 就搞定了一切。而且,以后依赖的包有升级的话,也可以 composer update 来搞定。

你可以在 Packagist 中搜寻你想要的代码库,找到最受欢迎的且最合适的代码包,愉快的使用它,就是这么简单。

PHP模板

在HTML页面中,我们如何输出变量,控制代码分支和循环操作呢?如果你还在使用像这样的代码,那会稍显落伍了

<?php if($list){ ?>
<?php foreach($list as $v){ ?>
<div><?php echo $v; ?></div>
<?php } ?>
<?php } ?>

不说这样写很丑,但是,确实越来越少人这样用了。最大的弊端就是,当 <?php } ?> 过多的时候,你都不知道它应该跟那个分支配对。

而用PHP的原生模板语法,则可以提高可读性,看起来漂亮很多,像这样:

<?php if ($list): ?>
<?php foreach ($list as $v): ?>
<div><?php echo $v ?></div>
<?php endforeach ?>
<?php endif ?>

if 配 endif,foreach 配 endforeach,看起来代码结构很清楚。如果你说,这还不是一样要敲很多代码么,反正都是用手敲,我还是习惯于虽丑但用惯了的方式。所幸,如果你用 Sublime Text 或者 Atom 或者其他什么像点样的写代码的工具的话,这些都可以自动生成,完成上面的代码,不消 5 秒钟。

上面说的是PHP的原生模板,是PHP本身语法特性,原生支持。还有些编译模板,是由第三方支持的,如:Smarty 和 Twig。Smarty 在初学PHP的时候就用过,因为我买的那本书里提到了,于是就用了。Twig 没用过,感觉很吊的样子。不过我还是觉得原生模板用着更顺手,想怎么用就怎么用,无拘无束,不需要付出额外的学习成本。

近期用 ThinkPHP 的模板引擎,总是用不惯,在关键的、难写的地方,我还是会采用原生模板来写。至于,是要使用PHP的原生模板,还是使用编译模板,又或是使用框架自身的模板引擎,由个人喜好来定,没什么不妥的。但可别再用 花括号 的这种形式了。

其他我所还能知道的一点
  • Xdebug

    写代码的,难免遇到些棘手、诡异的问题,此时就需要调试代码了。我相信,我们大部分PHPer、包括我自己,调试代码的方法就是用 var_dump(),因为简单直接,对于一些小问题,懒得去打断点再一步步走。但对于一些大点的问题,要学会用 Xdebug 来调试程序了。如果你用 IDE 写代码的话,那么调试功能自不在话下,如果你用 Sublime 或 Atom 之类的,最好找一款好用的调试插件。但是,据我的经验,在调试 ThinkPHP 的时候,会有进不到断点的情况,可能与框架有关,又或许与我用的 Sublime 调试有关。总之,调试的话,当然用 IDE 最强啦,听说 PHPStorm 挺好用的,神器,以后有机会,尝试一下。

  • 听过见过没用过

    Vagrant 和 Docker 都能提供一种虚拟化环境,这样可以统一开发环境,避免大家环境不一致,造成不必要的麻烦。至于这种看起来有些高端的技能,我还没用过,只是有所耳闻而已。

    PHPDoc 是注释 PHP 代码的非正式标准。学会了这个注释标准后,可以通过 php-apidoc 来生成接口说明文档,是不是很吊。当然,这个我也只是见过,也还暂时没用过。

这段里讲了Composer、PHP模板、Xdebug、虚拟化和PHPDoc,只是PHP之道里的十之一二,详细的内容,还是要读一读PHP之道或者英文原版的内容

PHP 框架

PHP 的框架太多了,我却用的不多,屈指可数:

CodeIgniter

ThinkPHP

LazyPHP

最早用的CodeIgniter,没用它做过什么正儿八经的项目,纯粹拿来学习练手的。跟其他主流框架一样,都是MVC模式。挺好用的,上手简单,文档完美,是个优秀的轻量级框架。

现在工作中,用的ThinkPHP,3.1版本,不是很喜欢用,可能国内很多公司用的原因,所以感觉在国内的流行度还是蛮高的。在我这段时间使用的经验和感觉来看,TP3.1版本还是有些功能上的缺陷的,比如我上面提到的写日志的问题,比如往数据库save()的时候,若没有用数组而用对象的方式,则可能会出问题等等,感觉上某些不稳定因素,会导致在使用TP的时候,用着不爽。也许,最新的5.0版本会更好吧。当然,在TP的使用上,我是个菜鸟,可能都没有资格评价它,每个人有自己的喜好,挑一个自己觉得顺手的用就好了。若等日后武艺精进,定会去寻那趁手的兵器的。

我不喜欢用大框架,我喜欢小的,简单的框架。所以,我之前都在用LazyPHP。这是一个极小极小的框架,比CI还要轻量级。花2个小时或者一下午的时间,阅读框架的核心源码,就能搞清楚它的全部内容。日后做东西时,拿来就用。使用它的时候,没有太多的束缚,不用像用TP的时候,要时不时的去翻文档,看看某个方法怎么用,这个完全不会。因为框架简单,所有的东西都知道,用的时候自是得心应手。

可是,简单有简单的弊端,有些东西要自己实现。比如分页。人家CI还有个分页组件呢,这个啥组件都没有,要自己写。我就自己吭哧吭哧的写了个分页,完了之后,以后做其他项目的时候,都用的这个分页组件。还有,不支持伪静态,URL不友好,比较适合做后台管理,不适合做前端。好与不好,用者自知,喜欢就好。还是那句话,日后功成之时,自会去寻一神器傍身。

LazyPHP4,原作者在使用前一版本的时候(Lazyphp3),也觉得不爽,于是搞了4出来。必须要说的是,不管是3还是4的版本,都是经历过商用的,是作者在实战中改进,最后分享出来的框架。LazyPHP4 比 3 改变的不是一点点,前一版本,最多花一个下午,就能把核心代码全部搞清楚,而新版本,则不可能,就光看看它使用 Composer 引用了大量的类库,就知道绝不简单。

Laravel,最后说一下这个号称最优雅的框架,我只刚开始研究过一点点,感觉挺牛逼的,毕竟好多牛人都用这个。所以,这是我未来的框架。如果要学习Laravel,这里有一个绝逼酷的网站Laravist,里面很多视频教程,虽然录制者操着带有广东口音的普通话,但是逼格很高,技术很好,这是一个很好的学习Laravel的地方。

目标:我会先学习使用 LazyPHP4,再学习 Laravel,与时俱进。

关于框架,就说这么多,自己用过的框架很少,其他的没用过,不好做评价,总之选择一个自己认为好用的就好。让初学者一上来就去用 Laravel,他也用不来,所以,各取所需的好。

工具善其事,必先利其器

以上,说的都是如何在 PHP 的道路上进阶,那么从编程工具上来讲,我觉得有必要说一说。

我见过的 PHPer 有用 NotePad++的、 Netbeans的、Hbuilder的、Dreamweaver的,也有用 PHPStorm 和 Sublime Text的。我自己用 Sublime。不说哪个工具好,哪个不好,我只说我的使用感受。

我一开始用的是NotePad++,好像是支持函数提示的。后来换成 Zend Studio,确实好用,很智能。再后来,发现了 Sublime Text,刚开始用的时候用不惯,用两天就用回Zend Studio了。后来貌似不甘心,又把 Sublime 捡起来了,一用至今。

此后也试过 Atom,感觉就写 PHP 来讲,还是没有 Sublime 来的爽,而且 Atom 那速度太慢了,用 Sublime 打开文件像剑一样的快,而用 Atom 则慢吞吞。回想起来,让我彻底放弃用 Atom 写 PHP 代码的主要原因,是因为 Sublime Text 3 里有 Goto Definition,而 Atom 我没找到解决方案,遂放弃。

要知道,跳转到函数定义,这个功能是跟代码的利器,没有它,难道让我去点目录树,一层层找文件吗?非常的建议使用 Sublime Text 3,而不是2的版本,就是因为3自带 Goto Definition 功能。

关于 Sublime Text 的使用教程,网上有很多优秀的,我自己也写过一篇,Sublime Text 3 绝对神器,创记录的阅读量,两年多以来总共接近7万的阅读。用 Sublime 算起来也有3年了吧,后面其实还想写一篇关于 Sublime Text 3 的使用教程,查漏补缺,配上动图,把我用过的好用的插件,所知道的使用经验,总结分享出来。

就写 PHP 来讲,Sublime 并不是终极神器,还有 PHPStorm 呢。用 Sublime 异或高手们用 vim 写 PHP,给人的感觉不过是脚本小子,而用 PHPStorm,则显得很上档次,尤其是在 Macbook 上用 PHPStorm 的时候,一个字:酷。

Macbook,我心里长的草。我现在很穷,我在攒钱,上个老板还欠我两个月的工资,很悬了,如果这两个月的工资发了,我就有钱买book了。你看,再过半个月,苹果就要开大会了,book也可能要更新了,可是我没银子。只能让心里的草再长的茂盛一点了吧。

最后,放一张我的 Sublime 的主题照,用的 One Dark Material Theme,因为用 Atom 觉得它的默认主题很舒服养眼,所以找了这么一个跟 Atom 默认主题非常像的这个:

PHP开发者的路书