功能/功能,使您的应用程序更专业?编码爱好者

mar*_*rio 63 php

您在PHP Web应用程序中实现了哪些功能(如何),因为您认为它在某种程度上" 更专业 "?或者你有个人的挑剔和代码爱好,特别是可能有用的小东西?哪些不受欢迎的代码或次要功能您花费了大量时间才能做到正确

.

Q&A插图的编码爱好者示例:

配置数据不在数据库中:应用程序数据!=配置数据,这也是必要性和效率的问题.

URL修复:通过附加尾部斜杠来规范化所有Web地址,即使技术上不需要也是如此.

人类可读的cookie:对于数据隐私,我尝试避免不透明的会话/数据库句柄(对于用户选项,而不是授权使用).

内容协商:对RSS和Atom格式之间的简单变化有意义.但我发现很少使用它.

UI中没有数据库ID:避免将数据库内部代理键泄露到URL中.使用ORMs,db-internal密钥甚至不必泄漏到业务逻辑中.

.

提示(不是规则)

  • 那么,您认为哪些功能会使您的Web应用程序高于平均水平?
  • 为什么不常见?
  • 它对用户有益吗,但同样容易被忽视?
  • 更专业和安全的编码建议非常关注主题.他们总是如此.
  • 但是,此问答的预期范围实际上是不常见/独特的功能,可能还有非标准和有争议的功能.迷人的大奖金.
  • 它也是关于编码偏好和挑剔,恰好在PHP中实现.
  • 不要想太大或太高的水平.小功能也很重要.
  • 如果可行,显示代码.
  • 然而,语法和编码风格/范例大多是偏离主题的.
  • 我们不要争论有用性或代码质量.这纯粹是一个特征性和代码调查.

第一个特征性研究奖励回合:很难确定其中一个好主意.说实话,我只能把它缩小到最喜欢的五个并将决定权交给rand().这个话题非常有趣,足以保证第二轮赏金.休息一下.也许其他人接管来改进范围.

koe*_*oen 40

文档.

想象一下,无论有没有最新的文档,您都可以找到任何开源项目,并感受到它对您认为的专业程度的影响.

  • 还要注意反模式:冗长的phpDoc注释和自动生成的列表不能替代教学文档. (13认同)
  • 对于开源项目来说,这非常重要.没有文档的项目很难处理.我想贡献给Mozilla或PHP,但他们没有文档,因此我不能:( (2认同)

Nik*_*kiC 31

关注安全性,尤其是用户私人数据的安全性.

使用像bcrypt这样的强哈希来存储密码(参见crypt文档):

// generating hash
// read up how $costParameter and $salt look like in the crypt() docs
$hash = crypt($password, '$2a$' . $costParameter . '$' . $salt . '$');

// checking if password is correct
if (crypt($whatTheUserEntered, $hash) == $hash) {
    // correct password
}
Run Code Online (Sandbox Code Playgroud)

$salt不应该是静态值.每个用户都应该有所不同.

  • `$ salt`也应该是用户无法改变的东西,因为这会使他们的密码无效,他们不得不改变一个新密码.所以,如果用户名是永久的,那就太好了 如果没有,可能是他们的行ID,创建时间等. (8认同)
  • 为什么不使用php的内置`crypt()`函数?您可以使用像bcrypt/eksBlowfish,SHA-256或SHA-512这样的强大的密码,它完全抽象出这样的实现细节. (3认同)
  • 多次迭代的+1会增加蛮力所需的时间. (2认同)
  • @Logan Bailey:显然它不会增加熵.这项技术称为拉伸,用于使裂缝哈希更加时间紧迫.在你的服务器上散列几千次可以忽略不计,因为你很少这样做,但它会大大减慢攻击者需要字典/ ...攻击散列的时间;)PS:不,盐不会阻止字典攻击.它只能防止攻击者无法为数据库中的所有哈希使用一个彩虹表,但必须为每个密码生成大量哈希值;) (2认同)

myk*_*hal 24

对于专业外观,非常重要的是清洁和美观的图形设计.因为封面是卖的,这些天.伤心,但也是如此.具有漂亮代码和丑陋外观的Web应用程序不会引起太多关注.

  • 这是许多优秀程序员倒下的地方.特别是当涉及程序流程如何工作时.程序员总是确定他们所写的内容是直观的,因为 - 他们认为是,通常是创造性偏见的强烈案例. (4认同)
  • 这并不像听起来那么浅.有些人会因为这样说而杀了我,但平面设计,用户界面和用户体验往往是相关的. (4认同)
  • 是!雇一个**真正的**艺术家(或找一个志愿者 - 虽然不容易,但在版权方面他们有不同的心态).哎呀,杰夫阿特伍德自己说:Stackoverflow的原始版本很糟糕,直到他们聘请了一位真正的艺术家来完成设计. (3认同)

Pek*_*ica 22

一个健康检查

一系列预先配置的测试,用于确定Web应用程序或网站的基本"健康状况",可以随时查看(由管理员/网站所有者),显示如下内容:

  • 数据库服务器是否可访问?
  • 必要的文件和目录是否可写?
  • 所有数据结构都是健全和完整的吗?
  • 是否正确显示所有页面/对话框/查询?
  • 有足够的磁盘空间吗?
  • 等等

一个简单的状态页面显示具有绿色,橙色或红色背景的系统的当前"健康状况".

这与单元测试的不同之处在于它处理"真实世界"环境的健康状况,而不是抽象代码完整性.

运行状况检查还可以轻松地将应用程序迁移到另一台服务器.

我已经在几个需要持续监控的项目中实现了这一点; 我打算在今年的某个时候将它变成一个小的,可扩展的"drop in"开源应用程序,可用于各种Web应用程序甚至网站.参与和投入非常欢迎 - 请参阅 相关的SO问题了解更多详情.

  • 令人好奇的是,所有主要的PHP应用程序都带有执行大多数这些检查的安装程序.但它在管理员后端普遍缺失. (3认同)

Sam*_*ody 15

源控制. 特别是Git(虽然不是特别是GitHub)

好的,这并不罕见.
但是当我外包代码并获得一个整齐的回购,包含所有的历史和曲折时,我对一个充满php文件的文件夹印象深刻得多.
并且它展示了在项目中投入了多少额外的工作.

我使用的是GitFlow,它在使用过程中需要更长的时间,但是在完成的项目中,它会让自己更加令人印象深刻.确保客户端看到github图(或等价)所有这些分支看起来整洁和令人印象深刻.(除了实际有用!)

相关:
问题跟踪系统.
两者都在代码完成之前(当客户端正在审阅时)和后记,以允许它们添加新任务.
它不仅是划分任务和获得更多工作的一种方式,它还使客户感到项目仍然在我的脑海中.即使我继续前进.
我使用Collabtive,这是非常可怕的,因为这些系统,但更令人印象深刻的是看起来我尝试过的任何东西,看起来令人印象深刻的东西被认为是专业的.


oco*_*odo 12

密码强度/匹配

注册或更改密码时,会以交互方式通知用户密码的强弱.当他们打字时确认匹配时也通知他们.

实时表单验证

与密码一样,表单条目的实时验证比允许用户在知道错误之前完成整个表单或省略他们跳过的必填字段要小得多.

具有友好异常/错误处理的防御性编程

永远不要使用神秘的错误消息,并且通常会参考您可以找到的最佳案例示例,以获得良好的友好错误消息.在最好的情况下,这通常需要一个才华横溢的复制作者,以保持良好的语调等.

这与可靠的异常处理和良好的防御性编程密切相关.

防御性设计是一本关于这个主题的相当不错的书.


Cro*_*zin 12

编写易于维护的代码.在开始写作之前,请多想几次关于对象的界面.添加许多事件触发器,即使您现在不需要它们.它们可能在该功能中很有用.

编写代码就好像它是一个外部库.即使您正在处理商业,封闭式应用程序也将其视为开源项目.考虑可能希望在不更改现有代码的情况下更改现有代码行为的其他用户.当你使用类型提示时,你应该检查接口而不是类,所以:

public function add(Storable $resource);    # Good
public function add(SessionStore $session); # Bad
Run Code Online (Sandbox Code Playgroud)

不要使用全局命名空间和"全局功能".定义全局常量或使用__autoload()(而不是使用另一个自动加载器spl_autoload_register())是一种不好的做法.

Use 3rd-party-code. There is a lot of libraries out there. Most of the time it makes no sense to develop own ORM or Mailer. It reduces the amount of time needed to develop an application -> it reduces costs.

Create API documentation. I don't think that any explanation is needed.

Make your code look clean and keep some coding conventions.

Don't create useless pages. There is nothing more annoying than 404 Not Found page with nothing more that just a big 404 NOT FOUND information. You should probably provide several not found pages for each resource. So if I visit /video/123/how-to-swim and such resource doesn't exist except We're sorry, that video doesn't exist or has been removed. add something like: Recent videos, Maybe you're looking for: "how to dace", "swimming: abc" (videos with title similar to title form URL (how-to-swim)) etc.

允许用户自定义网站.想象一下,你有一个带有几个"盒子"的主页:最近的视频,最近的照片,最近的活动主题,新闻,推广的画廊等.允许用户隐藏其中一些,改变他们的订单 - 有人可能对照片更感兴趣和视频而不是新闻和线程所以他/她可能想要将它们放在页面顶部,其他人可能会得到不同的偏好并可能希望有不同的顺序.为每个框添加首选项,例如:"显示:5,10,20个最近的视频".


SW4*_*SW4 11

添加一些(更少PHP的)点数,这将增强用户体验,使您的应用程序更专业,但处理后端:

良好的压缩/缩小
通常,Web Apps会在加载和使用过程中发送大量请求.缩小可以帮助减少初始负载重量,也可以使用CSS精灵和GZipping内容.帮助您尽可能快速简化和使您的应用程序的一个很好的方法是Yahoo的FireSug Extension的YSlow插件:

Firebug:http: //getfirebug.com/

YSlow:http: //developer.yahoo.com/yslow/

还有一些好的做法:http: //developer.yahoo.com/performance/rules.html

YSlow将帮助您确定如何真正使您的应用程序整洁,快速和干净.我还建议使用PHP Minify来处理大部分文件压缩,它是一个非常强大的工具:

PHP Minify:http://code.google.com/p/minify/

获得Firebug的另一个原因是它在开发任何Web应用程序时带来的巨大好处,其中最重要的是确定应用程序的安全性,因为在操作过程中您可以跟踪创建的数据流.

混淆
---分解为下面更详细的答案

很好地利用Apache重写
除了提供干净的URL以增强浏览体验和给出逻辑归档内容的印象的基本好处之外,一个好的.htaccess文件可以为您的站点添加额外的安全层,压缩内容服务器端并添加附加标识符(例如,电子标签,虽然它们的好处是有争议的).每个Web应用程序也应该有一个很好的.htaccess.

兼容性/验证
我总是强烈要求任何开发人员使用最广泛(合理)的长度来确保所有输出代码都是有效的,评论的,逻辑的和清洁的.W3C做得非常出色,不仅可以清晰地显示HTML,还可以了解Web应用程序的运行方式.遵循他们的指导,以提高您编写的任何内容的兼容性,以确保它适用于您所设想的每个人.

一些很棒的工具:

HTML验证器:http://validator.w3.org/

其他验证:http://validator.w3.org/unicorn/

有些规格需要注意:

W3C Web应用程序(WebApps)工作组:http://www.w3.org/2008/webapps/

W3C可访问性指南:http://www.w3.org/WAI/guid-tech.html

W3C WAI-ARIA倡议:http://www.w3.org/WAI/intro/aria.php

在Javascript方面,JS lint是一个很好的工具,可以确保JS中的任何错误(在检查时可能不会影响性能)被压扁:

JSLint:http://www.jslint.com/

通过代理,为了帮助开发,美化的JS可以帮助您更好地构建代码,用于开发,预先缩小:http://jsbeautifier.org/

或者美化PHP当然... http://beta.phpformatter.com/

最后 - 一点点黑白人性

生成基于Web的应用程序的最大好处之一可能是它们可以提供的连接,不仅是用户之间(为了鼓励协作工作),还有用户和应用程序本身之间以及负责其持续开发和维护的人员之间的连接. .

如果您考虑像37 Signals这样的项目 - 其中一个吸引人的因素是它们向用户传达项目(代码)本身已经人性化并具有角色的感觉,有助于吸引用户并与应用相关联,鼓励享受使用和与他人沟通.我并不是说应用程序似乎"活着",但更多的是它感觉更"平易近人",用户可以"识别"它.

然而,这只是人性化硬币的一个方面,几乎让用户对应用程序/代码/框架/体验感同身受,因此鼓励他们使用它.另一方面是打破应用程序与其背后的界限.

我们都喜欢知道我们使用的人,人等等 - 因为我们从他们那里传递了很多信息,并且经常将它不合理地应用到应用程序本身,实际上我们也喜欢它(比如史蒂夫乔布斯,购买苹果等等).虽然这是一个任性的例子.有一条路线可以让我们在遇到困难时与真人联系,这是一个简单的步骤,有一个开发者博客,新闻流等 - 围绕应用程序建立一个人性化的元节点给它可信度和感觉它可能比其各部分的总和.

无可否认,人性化可能既不存在也不存在 - 而且构建起来肯定非常困难(不同的人有不同的朋友),但是开发人员可以通过任何方式打磨更临床的手术应用程序并使其更舒适每天用户都很平易近人,也很有趣.


mar*_*rio 10

无强制注册
这是日常Web应用程序的常见问题.强制帐户注册不是用户友好的.现在,这是防止垃圾邮件和滥用的必要条件.但它妨碍了采用.

我想每个人都听说过Stackoverflow.他们不强制注册.你可以在没有帐户的情况下进行游说.它不是强迫注册,而是系统地鼓励注册.然而,重要的是,在提交之前至少有选择逐渐习惯.

这是一个简单的概念.但同样难以实施.您很少能够使用临时和可选的用户帐户,必须为其准备基本应用程序逻辑和数据库结构.无论实施工作如何,我相信这是一个重要的和未充分利用的功能.

  • 网上商店是最糟糕的.有时,人们只想买点东西. (2认同)

Ste*_*las 9

经常被忽视的一个:可打印的CSS.编写它很痛苦但对想要在应用程序中打印出某些数据的用户有很大的不同.

<link href="print.css" rel="stylesheet" type="text/css" media="print"> 
Run Code Online (Sandbox Code Playgroud)


Baj*_*aju 8

延续点

示例:您提交表单,您将被重定向,现在着陆页应该包含通知.大多数网站只是将该通知存储在会话中.这意味着:接下来将访问的任何页面都将显示该消息.在大多数情况下没问题,但我的脑海里真的很乱.我认为会话是针对会话数据的,而不是下一个请求数据.

我的解决方案:创建一个数组,将数据(通知和更多)写入其中,使用sessionid +唯一标识符将其保存在memcache中,并在重定向上添加param __continuation = {唯一标识符}.然后下一页再次加载该数据并进行处理.

当您希望获得的数据多于短消息时,这将变得更加方便.

有问题吗?


Ada*_*sey 6

一致的编程风格,可变命名,支撑等.遵守编码标准(任何编码标准.)确保不同人编写的文件看起来相同,以便维护代码不需要知道谁编写了它.


mar*_*rio 5

以Jus为例:URL"修复"
对于http-URLs,我将路径片段视为强制性的,就像每个浏览器一样.所以我指出"修复"用户输入和导入的数据,并且在显示或存储这些值之前总是将尾部斜杠添加到例如http://example.org.可能不是"超级专业化",但规范化URL通常会简化以后处理它们.而且不知道,它似乎"更好".

 $url = preg_replace("/^(http:..[-\w.\d]+)$/", "$1/", $url);
Run Code Online (Sandbox Code Playgroud)

所以http://example.org/无论怎样,我都会有价值观.这不会使你的HTML符合标准,但这只是的一个小小的烦恼.


mar*_*rio 5

UI中没有数据库ID
大多数数据库对象都使用一些代理键进行枚举.我认为看起来不太时髦(并且可能偶尔会出现安全隐患)正在将这些泄漏到UI中,就像在URL中一样.这不是什么大不了的改变任何occourence user.php?id=37310843user.php?name=title.并且数据库查找ID或名称几乎没有什么区别.所以这不是关于SEO的愚蠢,而是关于一个光芒四射的外表

  • 使用正确的ORM,这些数据库内部ID甚至不必泄漏到应用程序逻辑中.
  • 展览维基百科:想象他们使用代理键而不是页面标题.(见CoWiki)
  • 为了使外部链接始终指向标准内容,应该仍然避免使用代理键.如果重要的是具有精确的分配,那么无论如何都应该使用GUID.