在 Scala 中的 implicit 定义指编译器在需要修复类型匹配时可以用来自动插入的定义。比如说,如果 x+y 类型不匹配,那么编译器可能试着使用 convert(x) + y, 其中 convert 由某个 implicit 定义的,这有点类似一个整数和一个浮点数相加,编译器可以自动把整数转换为浮点数。
应用中自己写的代码和调用的第三方函数库有着一个基本的区别:也就是你可以任意修改和扩展自己写的代码,而一般来说在没有源码的情况下很难扩展第三方函数库,只能利用函数库提供什么就是什么。C#3.0 支持静态扩展方法,可以为已经定义的库,类进行扩展。在 Scala 中解决这个问题是使用隐含类型变换和隐时参数。
隐式变换和隐式参数是 Scala 语言的重点,也是难点。Scala 使用隐含类型变换和隐时参数来解决自定义库和类扩展的问题。本系列文章介绍 Scala 的隐式变换和隐式参数的用途。适用人群本教程为中级教程,内容比较难理解,如果你没有一定的编程基础,建议从开发级的教程学起。学习前提学习本教程前,需要你对 Scala 开发教程有所了解。地址:http://www.imobilebbs.
使用 === 操作符来检测 null 和布尔 false 值。PHP 宽松的类型系统提供了许多不同的方法来检测一个变量的值。 然而这也造成了很多问题。 使用 == 来检测一个值是否为 null 或 false,如果该值实际上是一个空字符串或 0,也会误报为 false。 isset 是检测一个变量是否有值, 而不是检测该值是否为 null 或 false,因此在这里使用是不恰当的。
使用DateTime 类。在 PHP 糟糕的老时光里,我们必须使用 date(), gmdate(), date_timezone_set(), strtotime()等等令人迷惑的 组合来处理日期和时间。悲哀的是现在你仍旧会找到很多在线教程在讲述这些不易使用的老式函数。幸运的是,我们正在讨论的 PHP 版本包含友好得多的 DateTime 类。
没有一行式解决方案。小心、注意细节,以及一致性。PHP 中的 UTF-8 糟透了。原谅我的用词。目前 PHP 在低层次上还不支持 Unicode。有几种方式可以确保 UTF-8 字符串能够被正确处理, 但并不容易,需要深入到 web 应用的所有层面,从 HTML,到 SQL,到 PHP。我们旨在提供一个简洁、 实用的概述。
对于简单的数据净化,使用 htmlentities() 函数, 复杂的数据净化则使用 HTML Purifier 库经 HTML Purifier 4.4.0 测试在任何 wbe 应用中展示用户输出时,首先对其进行“净化”去除任何潜在危险的 HTML 是非常必要的。 一个恶意的用户可以制作某些 HTML,若被你的 web 应用直接输出,对查看它的人来说会很危险。虽然可以尝试使用正则表达式来净化 HTML,但不要这样做。
使用 filter_var() 函数Web 应用可能需要做的一件常见任务是检测用户是否输入了一个有效的邮件地址。毫无疑问你可以在网上找到一些声称可以解决该问题的复杂的正则表达式,但是最简单的方法是使用 PHP 的内建 filter_val() 函数。示例<?phpfilter_var('sgamgee@example.com', FILTER_VALIDATE_EMAIL);//Returns "sgamgee@example.com".
使用PHPMailer经 PHPMailer 5.1 测试PHP 提供了一个 mail() 函数,看起来很简单易用。 不幸的是,与 PHP 中的很多东西一样,它的简单性是个幻象,因其虚假的表面使用它会导致严重的安全问题。Email 是一组网络协议,比 PHP 的历史还曲折。完全可以说发送邮件中的陷阱与 PHP 的 mail() 函数一样多,这个可能会令你有点「不寒而栗」吧。
使用 PHP-FPM有多种方式来配置一个 web 服务器以提供 PHP 服务。传统(并且糟糕的)的方式是使用 Apache 的 mod_php。Mod_php将PHP 绑定到 Apache 自身,但是 Apache 对于该模块功能的管理工作非常糟糕。一旦遇到较大的流量, 就会遭受严重的内存问题。后来两个新的可选项很快流行起来:mod_fastcgi 和 mod_fcgid。
使用 PCRE(preg_*)家族函数PHP有两种使用不同的方式来使用正则表达式:PCRE(Perl兼容表示法,preg_*)函数 和 POSIX(POSIX 扩展表示法,ereg_*) 函数。每个函数家族各自使用一种风格稍微不同的正则表达式。幸运的是,POSIX 家族函数从 PHP 5.3.0 开始就被弃用了。因此,你绝不应该使用 POSIX 家族函数编写新的代码。 始终使用 PRCE 家族函数,即 preg_* 函数。
若你需要一个分布式缓存,那就使用 Memcached 客户端库。否则,使用 APC。缓存系统通常能够提升应用的性能。Memcached 是一个受欢迎的选择,它能配合许多语言使用,包括 PHP。然而,从一个 PHP 脚本中访问一个 Memcached 服务器,你有两个不同且命名很愚蠢的客户端库选择项: Memcache 和 Memcached。
使用 APC在一个标准的 PHP 环境中,每次访问PHP脚本时,脚本都会被编译然后执行。 一次又一次地花费时间编译相同的脚本对于大型站点会造成性能问题。解决方案是采用一个 opcode 缓存。 opcode 缓存是一个能够记下每个脚本经过编译的版本,这样服务器就不需要浪费时间一次又一次地编译了。
使用 define(),除非考虑到可读性、类常量、或关注微优化习惯上,在 PHP 中是使用 define() 函数来定义常量。 但从某个时候开始,PHP 中也能够使用 const 关键字来声明常量了。 那么当定义常量时,该使用哪种方式呢?答案在于这两种方法之间的区别。define() 在执行期定义常量,而 const 在编译期定义常量。
其实并不重要。已有很多人花费很多笔墨来讨论是使用单引号(')还是双引号(")来定义字符串。 单引号字符串不会被解析,因此放入字符串的任何东西都会以原样显示。 双引号字符串会被解析,字符串中的任何 PHP 变量都会被求值。 另外,转义字符如换行符 \n 和制表符 \t 在单引号字符串中不会被求值,但在双引号字符串中会被求值。
使用 spl_autoload_register() 来注册你的自动加载函数。PHP 提供了若干方式来自动加载包含还未加载的类的文件。 老的方法是使用名为 autoload() 魔术全局函数。 然而你一次仅能定义一个 autoload() 函数,因此如果你的程序包含一个也使用了 __autoload() 函数的库,就会发生冲突。
使用 <?php ?> 。有几种不同的方式用来区分 PHP 程序块:<?php ?>, <?= ?>, <? ?>, 以及<% %>。 对于打字来说,更短的标签更方便些,但唯一一种在所有 PHP 服务器上都一定能工作的标签是<?php ?>。 若你计划将你的 PHP 应用部署到一台上面的 PHP 配置你无法控制的服务器上,那么你应始终使用 <?php ?>。
使用 PDO 及其预处理语句功能。在 PHP 中,有很多方式来连接到一个 MySQL 数据库。PDO(PHP 数据对象)是其中最新且最健壮的一种。 PDO 跨多种不同类型数据库有一个一致的接口,使用面向对象的方式,支持更多的新数据库支持的特性。你应该使用 PDO 的预处理语句函数来帮助防范 SQL 注入攻击。 使用函数 bindValue 来确保你的 SQL 免于一级 SQL 注入攻击。
使用 phpass 库来哈希和比较密码经 phpass 0.3 测试,在存入数据库之前进行哈希保护用户密码的标准方式。 许多常用的哈希算法如 md5,甚至是 sha1 对于密码存储都是不安全的, 因为骇客能够使用那些算法轻而易举地破解密码。对密码进行哈希最安全的方法是使用 bcrypt 算法。开源的 phpass 库以一个易于使用的类来提供该功能。示例<?
带 Suhosin-Patch 的 PHP 5.3.10-1ubuntu3.6,安装在 Ubuntu 12.04 LTS 上。PHP 是 Web 世界里的百年老龟,它的壳上铭刻着一段丰富、复杂、而粗糙的历史。 在一个共享主机的环境里,它的配置可能会限制你能做的事情。为了保持清晰地叙述,我们将仅针对一个版本的 PHP 进行讲述。 在 2013 年 4 月 30 日时,该版本为 PHP 5.3.10-1ubuntu3.6 with Suhosin-Patch。
关注时代Java