初学者

作为初学者,通常情况下,我们都会买一本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开发者的路书的更多相关文章

  1. GPS功能:百度路书自定义【轨迹回放】

    如题所述:百度的编辑界面很直观,修改后就可以运行,地址:http://developer.baidu.com/map/jsdemo.htm#c2_8: 因为同事研究了一下午结果都没搞出来,他copy百 ...

  2. JS 百度地图路书---动态路线

    JS 百度地图路书---动态路线 <!DOCTYPE html> <head> <meta http-equiv="Content-Type" con ...

  3. [敏杰开发]知识路书——图形化文献管理大师 Beta版发布喽!!!

    [敏杰开发]知识路书--图形化文献管理大师 Beta版发布喽!!! 一.总览 项目名称:知识路书 发布形式:网页应用 发布地址:http://roadmap.imcoming.top 二.运行环境与使 ...

  4. [知识路书]beta设计和计划

    [知识路书]beta设计和计划 一.需求再分析 根据用户反馈,是否发现之前的需求分析有偏差?为什么会出现这种偏差?beta阶段你们是否能真的分析清楚用户需求?如何做到? 根据alpha阶段的推广情况以 ...

  5. 铺路、建路、指路:联想ISG给出一份全新的智能化“路书”

    新基建,新服务,新智能:联想给出的"高质量"方案 昨天,第七届联想创新科技大会(Lenovo Tech World 2021)正式召开.每年通过这个大会,各行各业不仅可以了解联想最 ...

  6. Linux 运维入门到跑路书单推荐

    一.基础入门 <鸟哥的Linux私房菜基础学习篇>:最具知名度的Linux入门书<鸟哥的Linux私房菜基础学习篇>,全面而详细地介绍了Linux操作系统. https://b ...

  7. java开发者最常去的20个英文网站

    java开发者最常去的20个英文网站: 1.[http://www.javaalmanac.com] Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的 ...

  8. Python开发者现实版养成路线:从一无所知到无所不知

    初级开发者学Python容易陷入茫然,面对市面上种类众多的编程语言和框架,重要的是坚持自己的选择,宜精不宜杂.本文是一篇指路文,概述了从编程基础.引导.文档阅读.书籍和视频.源代码等学习和积累环节,值 ...

  9. 推荐几本WinCE 6程序开发的书

    因为学校期中考试和课程设计的原因,winCE6的项目开发耽误了一个多月的时间,现在学校没什么事情了,公司这边杂事也差不多办完了,可以专心的搞开发了,同时这也成了我的毕业设计,我不得不上心喽. 今天在卓 ...

随机推荐

  1. 懂点PS技巧,你会减少很多痛苦

    UI设计 不像平面设计那样随性, 期间可以用点技巧来减少痛苦. 1. 设置网格线 保持像素完美 不在1:1分辨率下也能保持像素完美,可以通过创建网格线来避免虚边的出现. 编辑 > 首选项 > ...

  2. 洛谷P4437 排列 [HNOI/AHOI2018] 贪心

    正解:贪心 解题报告: 传送门! 发现做题龟速,,,所以懒得写题目大意辣自己get一下QAQ 首先看到ai<=n,又当ai=j时j在i的前面,所以就变成对于每个点i有一个约束,即要求第ai个节点 ...

  3. usb设备运行不正常的解决方法(转)

    add by zhj:上午鼠标还用的好好的,下午就不能用了,插上之后提示“跟这台计算机连接的一个usb设备运行不正常”,尼玛,什么情况?我今天没安装软件啊,换了个USB接口也不行,在另一台电脑上试还是 ...

  4. 移除wordpress版本信息 删除无用信息

    wordpress页面头部有很多无用的信息,像wordpress版本信息.feed等,如何把它们删除或不让它们先是出来呢? 将下面的代码加入到当前主题的functions.php,可以适当酌情保留 & ...

  5. 007-jdk1.6版本新特性

    一.JDK1.6 名称:Mustang(野马) 发布日期:2006-04 新特性: 1.1.AWT新增加了两个类:Desktop和SystemTray[忽略] 前者可以用来打开系统默认浏览器浏览指定的 ...

  6. [py][mx]django模板继承-课程列表页

    课程列表页分析 1,机构类型 2,所在地区 3.排序 学习人数 先分析下 纵观页面,页头页脚都一样. django提供了模板继承. 至少 不同页面的title 面包屑路径 content内容不一致,以 ...

  7. 尝试.Net Core—使用.Net Core + Entity FrameWork Core构建WebAPI(一)

    想尝试.Net Core很久了,一直没有时间,今天回家,抛开一切,先搭建一个.Net Core的Demo出来玩玩. 废话少说,咱直奔主题: 一.开发环境 VS2015 Update3 Microsof ...

  8. Postman + newman + jenkins 的API自动化测试应用

    一.环境配置 Postman postman 的具体使用可以参考另外一篇文章:postman 做接口测试之学习笔记 Newman 第一步,安装nodejs. 第二步,在nodejs命令行安装newma ...

  9. docker 批量删除容器和镜像

    docker 批量删除容器和镜像 1,删除单个镜像或者容器 docker  rmi  镜像ID/镜像名字:TAG docker  rm  容器ID/容器名字 1.停止所有的container,这样才能 ...

  10. Selenium Webdriver——操作隐藏的元素(二)display属性

    有时候我们会碰到一些元素不可见,这个时候selenium就无法对这些元素进行操作了.例如,下面的情况: 页面主要通过“display:none”来控制整个下拉框不可见.这个时候如果直接操作这个下拉框, ...