[关闭]
@lgh-dev 2017-12-06T03:53:25.000000Z 字数 4557 阅读 639

现代化的PHP编程语言学习笔记-标准

PHP


标准

组件

  • php组件的文件组织方式
    1、src/ 这个目录包含组件的源码(比如PHP的类文件)
    2、tests/ 这个目录是组件的测试。
    3、composer.json 这个是Composer配置文件。这个文件用于描述组件,还会告诉Composer的自动加载器,把组件中符合PSR-4规范的命名空间对应到src/目录。
    4、README.md 这个Markdown文件提供关于组件的有用信息,包括组件的名称、说明、作者、用法、贡献者指导方针、软件许可证和要感谢的人

良好实践

1、过滤输入,验证数据,转义输出
2、Html Purifier 库,使用指定的规则过滤HTML输入,缺点是速度慢,配置困难。
3、PDO是PHP内置的数据库抽象层,使用一个接口表示多种数据库。PDO预处理语句是PDO提供的一个工具,用于过滤外部数据,然后把过滤后的书库嵌入sql查询。
4、加密是双向算法,加密的数据可以解密;而哈希是单向算法,哈希后的数据不能在还原成原始值,而且相同的数据得到的哈希值始终相同。
5、最安全的哈希算法是bcrypt,它故意设计的很慢,会自动加盐,防止潜在的彩虹表的攻击。
6、DateTime类提供了一个面向对象的接口,用于管理日期和时间。一个DateTime实例表示一个具体的日期和时间。
7、DateInterval 实例表示长度固定的时间段(例如"两天"),或者相对而言的时间段(例如"昨天"),DateInterval实例用于修改DateTime实例。
8、如果经常需要处理日期,应该使用nesbot/carbon组件。yi a

数据库

1、PDO是一系列PHP类,抽象了不同数据库的具体实现,只通过一个用户界面就能于多种不同的数据库通信,但是我们仍然必须自己编写sql语句
。PDO的构造方法有一个字符串参数,用于指定DSN(Dsta Source Name,数据源名称),提供数据库链接的详细信息。
2、DSN开头是数据库驱动器的名称,后面跟着:符号,然后就是如下信息:mysql:host=hostname;dbname=database;port=3306;charset=utf8..
3、PDO中fetch()函数的参数,

  • PDO::FETCH_ASSOC 让fetch和fetchAll返回一个关联数组,key值是数据库的列名。
  • PDO::FETCH_NUM 返回一个健值为数字的数组,key是数据库列所在的索引。
  • PDO::FETCH_BOTH 返回一个既有关联数组,又有数字数组的数组。
  • PDO::FETCH_OBJ 返回一个对象。

4、事务是指把一系列数据库语句当成单个逻辑单元执行。这一系列语句要不都执行,要不都不执行。保持数据的一致性,安全性,持久性。
pdo http://php.net/manual/zh/pdo.setattribute.php 设置pdo的属性。

多字节字符串

1、多字节字符是指不再传统的128个ACSII字符集中的字符。PHP中处理字符串的函数默认假设所有字符串都是8个比特位。
2、使用mbstring扩展提供的多字节字符函数替代PHP默认的原生函数,尤其是处理Unicode字符串时,否则很容易损坏多字节的Unicode数据。
3、字符编码是打包Unicode数据的方式,以便把数据存储在内存中,或者通过线缆在服务器和客户端之间传输。
4、处理多字节字符串,一定要知道数据的字符编码,使用UTF-8字符编码存储数据,使用UTF-8字符编码输出数据。
5、mbstring 扩展不仅能处理Unicode字符串,还能在不同的字符编码之间转换多字节字符串。

1、流的作用是使用统一的方式处理文件,网络和数据压缩等共用同一套函数和用法的操作。是具有流式行为的资源对象。因此,流可以线性读写,或许还能使用fseek()函数定位到流中的任何位置。-php手册
2、流的作用是在出发地和目的地之间传输数据。出发地目的地可以是文件、命令行进程、网络链接、zip或tar压缩文件、临时内存、标准输入输出、或者php流封装协议实现的任何其他任何资源。
3、流式数据的种类各异,每种类型都需要独特的协议,以便读写数据,我们称这些为流封装协议。他们都包含如下过程: 开始通信,读取数据,写入数据,结束通信。
4、普通的ULR其实是PHP流封装协议标识符的伪装。php默认的使用的流封装协议是file://。
5、php://流封装协议:这个流封装协议的作用是与标准输入,标准输出和标准错误文件描述符通信.

PHP流四个常用流:
  • php://stdin 只读php流,数据来自于标准输入,可以接受命令行传入的脚本信息。
  • php://stdout 把数据写入当前的输出缓冲区,只能写,无法读或者寻址。
  • php://memory 从系统内存中读取数据,或者把数据写入系统内存,缺点是内存有限。
  • php://temp 她的作用和php://memory 类似,不过没有可用内存时,PHP会把数据写入临时文件。

6、php的文件系统函数(fopen,fgets,fputs,feof,flose...)能在所有支持这些函数的流封装协议中使用。
7、有些PHP流能接受一系列可选的参数,这些参数叫流上下文,用于定制流的行为。不同的流封装协议使用的上下文参数有所不同。流上下文使用stream_context_create()函数创建。这个函数返回的上下文对象可以传入大多数文件系统和流函数。
8、PHP流真正的强大之处在于过滤,转换,添加和删除流中传输的数据。要把过滤器附加到现有的流上,需要使用stream_filter_append()函数

  1. #使用流过滤器,获取近30天的日志信息 DatePeriod,DateTime,stream_filter_append
  2. $dateStart = new \DateTime();
  3. $dateInterval = \DateInterval::createFromDateString('-1 day');
  4. $datePeriod = new \DatePeriod($dateStart, $dateInterval, 30);
  5. foreach ($datePeriod as $date) {
  6. $file = 'logs/laravel_info-' . $date->format('Y-m-d') . '.log.bz2';
  7. if (file_exists($file)) {
  8. $handle = fopen($file, 'rb');
  9. stream_filter_append($handle, 'bzip2.decompress');
  10. while (feof($handle) !== true) {
  11. $line = fgets($handle);
  12. if (strpos($line, 'Error') !== false) {
  13. fwrite(STDOUT, $line);
  14. }
  15. }
  16. fclose($handle);
  17. }
  18. }

9、自定义流过滤器,是个PHP的类,扩展内置的php_user_filter类,这个类必须实现filter(),onCreate(),onClose()方法。而且必须使用stream_filter_register()函数注册自定义的流过滤器。流中每个地响都有两个属性,data和datalen 这两个分别是内容和长度。

错误和异常

1、错误出现的时间比异常早,错误会导致程序脚本停止执行,如果可能,错误会委托给全局错误处理程序处理。异常是PHP错误处理系统向面向对象演进后的到的产物,可就地处理,无需停止脚本执行。
2、PHP异常可以在php的任何层级抛出和捕获,异常提供的上下文信息比PHP错误多。可以扩展最顶层的Exception类。异常加上好的日志记录器比PHP错误能解决更多的问题。
3、错误遵守:一定要报告错误,开发环境显示错误,生产环境不显示错误,开发和生产环境都要记录错误。
4、Whoops为PHP错误和异常提供了设计精美的且易于阅读的诊断界面。Monolog日志记录器,SwiftMailer 邮件组件。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注