PHP开发者的路书
初学者
作为初学者,通常情况下,我们都会买一本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模式。挺好用的,上手简单,文档完美,是个优秀的轻量级框架。