首页
技术笔记
网址导航
Json在线解析
二维码
Ip地址查询
在线流程图
新用户注册
|
会员登录
在线工具
开发笔记
毒鸡汤
网址导航
免费在线流程图
19赞
364
当前位置:
开发笔记
>
编程语言
> 正文
40个迹象表明你还是PHP菜鸟
作者:家具销售_903 | 2021-08-03 18:57
这些迹象不只是用来告诉我是菜鸟,还告诉我还有很多要学习的。简介40个迹象的英文版权归ReinholdWeber所有,中译文作者yangyang(akadavidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有 SyntaxHighlig
这些迹象不只是用来告诉我是菜鸟,还告诉我还有很多要学习的。
简介
40个迹象的英文版权归Reinhold Weber所有,中译文作者yangyang(aka davidkoree)。双语版可用于非商业传播,但须注明英文版作者、版权信息,以及中译文作者。翻译水平有限,请广大PHPer指正。
40个Conquer的作者是《PHPer》李俊鹏,可用于非商业传播。
正文
我愿意把本文归入我的“编程糗事”系列。尽管在正规大学课程中,接触到软件工程、企业级软件架构和数据库设计,但我还是时不时地体会到下述事实带给我的“罪恶”感,当然,都是我的主观感受,并且面向Eclipse。
你是PHP菜鸟,如果你:
1. 不会利用如phpDoc这样的工具来恰当地注释你的代码
Conquer 1
phpDoc是PEAR下的一个优秀模块,如同javadoc一样为代码生成API文档。phpDoc采用OOP的思想编写,它扫描指定目录下的PHP源码,识别出注释中的专用标记然后生成XML文件(或其它),然后建立相应的索引。即本质是从源码中的注释生成文档。
2. 对优秀的集成开发环境如Zend Studio或Eclipse PDT视而不见
Conquer 2
我不知道该怎么描述Zend,只是夜色里有人曾这么说过:PHP界的Zend如同软件界的微软;而Eclipse则是另一款多功能的开发环境,想来大多数人都是用它来写Java的(比如我),而PDT即PHP Development Tools则是可以使用户可以在Eclipse写PHP的插件。BTW,如果有兴趣,你也可以自己为Eclipse开发个插件。^_^
3. 从未用过任何形式的版本控制系统,如Subclipse
Conquer 3
版本控制系统?还是先了解一下版本控制吧:版本控制就是数据仓库,它可以记录你对文件的每次更改。这样自然也就了解了什么是版本控制系统了。而进一步的了解不是三两句可以结束的,所以直接推荐,自己选择一个吧!
(1)
http://www.phpchina.com/bbs/thread-46209-1-1.html
(2)
http://bbs.phpchina.com/thread-47473-1-1.html
(3)
http://bbs.phpchina.com/thread-89264-1-1.html
4. 不采用某种编码与命名标准,以及通用约定,不能在项目开发周期里贯彻落实
Conquer 4
我觉得良好的代码书写习惯令人很舒服,缩进实在是必需的——要不看着那一堆密密麻麻毫无美感的代码,实在令人郁闷。缩进一般是4个空格,PEAR标准中不建议使用TAB键(在这里我小小汗颜一下),因为有些场合会出现问题(虽然我还没遇到)。而命名建议变量:第一个单词小写开头,其它大写开头如:myName,而类名建议都大写开头如:MyName或者My_Name,至于用不用下划线我觉得差别不大(如果很大请指教)。
5. 不使用统一开发方式
Conquer 5
由于还是个人PHP爱好者,所以对于团队共同开发还是经验匮乏的,在此,对于开发方式这个词有种好像理解又不理解的错觉,而且利用搜索引擎好久也很难找到一篇比较满意的文章,所以直接推荐:
(1)
http://www.phpchina.com/html/42/1142-7314.html
(2)
http://topic.csdn.net/u/20080509/09/9b81d740-68fc-4d63-9299-ce6675f240cb.html
(3)
http://www.ibm.com/developerworks/cn/web/wa-jacquard/index.html#N10064
其实,个人觉得开发方式这个词挺泛、挺抽象……
6. 不转换(或)也不验证某些输入或SQL查询串(译注:参考PHP相关函数)
Conquer 6
始终坚信一点:绝不相信未经处理的用户输入。而过滤用户输入是Web安全的基础。所以设计者始终应该清楚地知道数据的来源、过滤数据、将已经处理过的数据和未处理的数据区分开。
7. 不在编码之前彻底规划你的程序
Conquer 7
我个人觉得这点和写程序前画流程图之类或者做项目的开发流程一样,应该不需要过多解释。
8. 不使用测试驱动开发
Conquer 8
测试驱动开发(Test Driven Development,英文缩写TDD)是极限编程的一个重要组成部分,它的基本思想就是在开发功能代码之前,先编写测试代码。也就是说在明确要开发某个功能后,首先思考如何对这个功能进行测试,并完成测试代码的编写,然后编写相关的代码满足这些测试用例。然后循环进行添加其他功能,直到完成全部功能的开发。代码整洁可用(clean code that works)是测试驱动开发所追求的目标。(摘自百度百科)
9. 不在错误开启状态下进行编码和测试(译注:参考PHP函数error_reporting)
Conquer 9
我想一般写代码的时候都会开启错误报告吧。这里顺便了解下error_reporting原型为int error_reporting([ int $level]),该函数的作用是设置要显示报告的错误等级,详情参阅:
http://cn2.php.net/manual/en/function.error-reporting.php
10. 对调试器的好处视而不见
Conquer 10
推荐几款调试器:
(1)Zend IDE
(2)APD
(3)Xdebug
11. 不重构你的代码
Conquer 11
重构是指使用一系列重构准则(手法),在不改变“软件之可察行为”前提下,调整其结构,是对软件内部结构的一种调整。目的是在不改变“软件之可察行为”前提下,提高其可理解性,降低其修改成本。重构的好处能改进软件设计使软件更容易被理解,帮助设计者找到BUG,并且提高软件的开发速度。简而言之,重构就是改进已经写好的软件的设计。
12. 不使用类似MVC模式把程序的不同层次划分开
Conquer 12
MVC(Model View Controller)即模型—视图—控制器,视图是呈现给用户的一面,模型则是处理任务的模块,而控制器则是控制视图和模型间的映射,即在用户响应下选择何种模型进行处理,而任务处理后控制以何种视图呈现。
13. 不知道这些概念:KISS、DRY、MVC、OOP、REST
Conquer 13
(1)KISS是指Keep It Simple,Stupid(摘自wikipedia),指设计时要坚持简约原则,避免不必要的复杂化。
(2)DRY是指Dont Repeat Yourself(摘自wikipedia),特指在程序设计以及计算中避免重复代码,因为这样会降低灵活性、简洁性,并且可能导致代码之间的矛盾。
(3)OOP即Object-Oriented Programming,是指面向对象的程序设计。我一直觉得经典的比喻是汽车是一个类(Class),而这个类的属性有轮子、车身、马达等,方法有加速、减速等;而劳斯莱斯就是一个对象(Object)了,这个对象继承了汽车这个类的属性和方法;而如何实现加速、减速?这样的信息被隐藏了——即信息封装(封装),只留下用户接口给我们了,比如踩刹车、踩油门;至于多态嘛,我粗糙比喻下就是一台自动贩卖机(我们假设它每种价格只有一款饮料),同样是投币这种方法,但是你投进去2元跟5元得到的结果是不一样的——当然,除非这贩卖机有问题。
(4)REST(Representational State Transfer)是一种针对网络应用的设计和开发方式,可以降低开发的复杂性,提高系统的可伸缩性。REST提出了一些设计概念和准则:
a. 网络上的所有事物都被抽象为资源(resource);
b. 每个资源对应一个唯一的资源标识(resource identifier);
c. 通过通用的连接器接口(generic connector interface)对资源进行操作;
d. 对资源的各种操作不会改变资源标识;
e. 所有的操作都是无状态(stateless)。(摘自百度百科)
14. 不用return而是直接在你的函数或类中输出(echo/print)内容
Conquer 14
这一点,观摩大虾的源代码都是用return的,所以我一般也这么学习使用这,至于原因,我就是觉得这样用感觉蛮好的。或许是严禁风格吧。但是其实我对这句有点不理解,函数一般都是需要返回语句的嘛,除非是专门用来输出的函数。
15. 对单元测试或通用测试的优点视而不见
Conquer 15
(1)单元测试是在软件开发过程中要进行的最低级别的测试活动,在单元测试活动中,软件的独立单元将在与程序的其他部分相隔离的情况下进行测试,不仅能保证项目进度还能优化设计。我记得我以前在写比较长的C代码的时候都会在特定模块结束时补一段测试代码来检验,不知道算不算。^_^
(2)通用测试技术?这让我想起图书馆里图灵系列图书的一本《软件测试****》,具体名字忘记了。这些都是属于软件测试的范畴,如果需要可以
下载
:
http://bbs.phpchina.com/thread-94241-1-1.html
16. 总是返回硬编码的HTML,却不返回纯粹的数据、字符串或对象
17. 总是对“消息”和“配置参数”进行硬编码
Conquer 16-17
硬编码的使用会造成程序的不灵活,以后修改的复杂问题,还有可能会遇到编译的问题。更具体了解:
http://bbs.bc-cn.net/thread-32143-1-6.html
18. 不对SQL查询语句做优化
Conquer 18
SQL语句的优化是将性能低下的SQL语句转换成目的相同的性能优异的SQL语句。这样的好处是显而易见的,可使用人工智能自动SQL优化。
19. 不使用__autoload(译注:参考
PHP
手册相关描述)
Conquer 19
__autoload函数会在试图使用尚未被定义的类时自动调用。通过调用此函数,脚本引擎在 PHP出错失败前有了最后一个机会加载所需的类。详见:
http://cn.php.net/__autoload
20. 不允许智能错误处理(译注:参考PEAR的ErrorStack)
Conquer 20
PEAR_ErrorStack提供了一种基于堆栈的错误处理方法,将各种错误统一起来指向同一个地方以达到把多个无关项目连接到同
推荐阅读
程序员
为什么一个常数中有两个@符号?
如何解决《为什么一个常数中有两个@符号?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
将dict写入文件,每个键/值对在单独的行中
如何解决《将dict写入文件,每个键/值对在单独的行中》经验,为你挑选了1个好方法。 ...
[详细]
程序员
真实用户监控:可靠性标准
如何解决《真实用户监控:可靠性标准》经验,为你挑选了1个好方法。 ...
[详细]
程序员
奇怪的Java数学结果
如何解决《奇怪的Java数学结果》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何获得用户的交换/ outlook/office365照片?
如何解决《如何获得用户的交换/outlook/office365照片?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
从Avro GenericRecord获取输入值
如何解决《从AvroGenericRecord获取输入值》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何检查是否使用Protractor,CucumberJS和Chai检查复选框?
如何解决《如何检查是否使用Protractor,CucumberJS和Chai检查复选框?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
定义自定义负载平衡算法
如何解决《定义自定义负载平衡算法》经验,为你挑选了0个好方法。 ...
[详细]
程序员
PHP7与Symfony3的兼容性?
如何解决《PHP7与Symfony3的兼容性?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
添加Reporting.WinForms参考VS2015
如何解决《添加Reporting.WinForms参考VS2015》经验,为你挑选了1个好方法。 ...
[详细]
程序员
moment.js在现有日期设置时间并未正确设置时间
如何解决《moment.js在现有日期设置时间并未正确设置时间》经验,为你挑选了1个好方法。 ...
[详细]
程序员
从ASP.net项目调用静态异步方法
如何解决《从ASP.net项目调用静态异步方法》经验,为你挑选了0个好方法。 ...
[详细]
程序员
如何创建永远不会读取$ scope的$ scope函数?
如何解决《如何创建永远不会读取$scope的$scope函数?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
将IISExpress绑定到IP地址失败
如何解决《将IISExpress绑定到IP地址失败》经验,为你挑选了1个好方法。 ...
[详细]
程序员
切换git分支时如何处理vim缓冲区?
如何解决《切换git分支时如何处理vim缓冲区?》经验,为你挑选了1个好方法。 ...
[详细]
程序员
使用CSV和PowerSHell输出格式
如何解决《使用CSV和PowerSHell输出格式》经验,为你挑选了1个好方法。 ...
[详细]
程序员
如何通过刷出元素删除ListItem?
如何解决《如何通过刷出元素删除ListItem?》经验,为你挑选了0个好方法。 ...
[详细]
程序员
"UserControl"类型不支持直接内容
如何解决《"UserControl"类型不支持直接内容》经验,为你挑选了3个好方法。 ...
[详细]
程序员
从Go中的切片中删除字符串
如何解决《从Go中的切片中删除字符串》经验,为你挑选了1个好方法。 ...
[详细]
程序员
当您无法提供色彩美感时,手动创建图例
如何解决《当您无法提供色彩美感时,手动创建图例》经验,为你挑选了0个好方法。 ...
[详细]
吐了个 "CAO" !
吐个槽吧,看都看了
会员登录
|
用户注册
家具销售_903
这个屌丝很懒,什么也没留下!
关注作者
Tags | 热门标签
actionscrip
bash
c#
c++
c语言
erlang
flutter
go
golang
java
javascript
lua
node.js
perl
php
python
scala
typescript
RankList | 热门文章
1
共享中继nodeInterface
2
python socket GET
3
$ templateCache的工作原理如何?
4
汇编:数组编写问题
5
Rails 4 - 设置,在新用户创建时自动创建配置文件
6
SVN E155016 ...的工作副本数据库已损坏
7
从webhosting发送电子邮件,而无需使用用户名和密码
8
Mapbox GL JS禁用滚动缩放
9
我可以为一个联盟成员分配一个值并从另一个联盟成员中读取相同的值吗?
10
TensorFlow中矩阵和向量的有效元素乘法
11
如何将x509.Certificate转换为Go中的tls.Certificate?
12
在我按下ctrl + C之前,spark-submit没有退出
13
尝试...除了在python和selenium中没有捕获NoSuchElementException
14
Doctrine在多列中搜索字符串
15
什么是分布式系统中的CRDT?
16
python日志记录模块在crontab中运行时没有输出
17
Ipython Notebook:关闭部分细胞的优雅方式?
18
eslint规则数组中的数字是什么意思?
19
Ruby on Rails - 不使用资源路径的路径变量
20
通道是否为goroutine调度发送抢占点?
DevBox开发工具箱 | 专业的在线开发工具网站
京公网安备 11010802040832号
|
京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有