@lgh-dev
2017-12-06T03:53:42.000000Z
字数 2161
阅读 693
现代化的php编程语言学习笔记-特性
PHP
一、特性
命名空间
- 命名空间:作用是按照一种虚拟的层级结构组织php的代码,类似于操作系统的文件系统目录。命名空间是PHP语言的一种标记。
- 如果没有命名空间,不可能有现在的php生态系统跟基于组件的新兴架构。命名空间可以避免类,方法、变量等问题冲突。
使用接口
- 是两个PHP对象之间的契约,其目的不是让一个对象依赖另一个对象的身份,而是依赖另一个对象的能力。不管接口是如何实现的,只是关心是否实现了接口。
性状
- 性状是类的部分实现(常量、属性、方法),可以混入一个或多个现有的PHP类中,性状有两个作用:表明类可以做什么(like interface);提供模块化实现(like class)。
- 性状能把模块化的方式注入到多个无关的类中,从而促进代码的重用。
- DRY 是don't repeat yourself 的简称,不要在多个地方编写相同的代码。如果需要修改,只需在一处修改,改动就能体现道其他地方。
- PHP解释器在编译时会把性状复制粘贴到类的定义体中。但是不会处理这个操作引入的不兼容问题。如果性状假定类中有特定的属性和方法(在性状中没有定义),要确保相应的类中有对应的属性和方法。
生成器(generator)
- PHP生成器是PHP5.5.0后引入的的功能,生成器是简单的迭代器,与标准的PHP迭代器不同的是,PHP生成器不要求类实现Iterator接口,从而减轻了类的负担。生成器会根据需求计算并产出要迭代的值,即时计算并产出后续值,不占用宝贵的内存资源。
- PHP生成器不能满足所有的迭代操作需求,如果不查询,生成器永远不知道下一个要迭代的值是什么,在生成器中无法后退或者快进。生成器还是一次性的,无法多次迭代同一个生成器,如果需要,可以重建或克隆生成器。
- 生成器用yield关键字创建,和普通函数不同的是,它不需要返回值,只产出值。
- 生成器的右眼体现在,每次产出一个值后,生成器的内部状态都会停顿;向生成器请求下一个值时,内部状态又会恢复。内部状态一直在停顿和恢复之间切换,知道抵达函数定义体的末尾or遇到空的return;语句为止。
- 生成器是功能多样性和简洁性之间的折中方案。生成器是只能向前进的迭代器,这意味着不能使用生成器在数据集中执行后退,快进或查找操作,只能让生成器计算并产生下一个值。迭代大型数据集或数列时最适合使用生成器,因为这样占用的系统内存比较少。生成器也能完成迭代器能完成的简单工作,而且使用的代码较少。
闭包(Closure)
- 闭包是指在创建时封装周围状态的函数。即便是闭包所在的环境不存在了,闭包中封装的状态依然存在。
- 匿名函数其实就是没有名称的函数。匿名函数可以赋值给变量,还能像其他的任何PHP对象那样传递。不过他仍是函数,可以调用,可以传入参数。
- PHP 闭包和匿名函数使用的据法和普通函数相同,他们其实是伪装成函数的对象。如果审查PHP闭包或匿名函数,会发现他们是Closure类的实例。闭包和字符串或整数一样,也是一等值类型。
- 我们之所以能调用变量,是因为变量的值是一个闭包,而且闭包对象实现了 __invoke() 魔术方法。是要变量后面有(),php会查找并调用 __invoke()方法。
- 如果只需要一次回调,没必要单独定义具名函数,把闭包当成回调使用,会使得代码更简洁,更清晰。
- bindTo()方法为闭包增加了一些有趣的潜力,它可以把Closure对象的内部状态绑定到其他对象上。bindTo()方法的第二个参数很重要,其作用是指定绑定闭包的那个对象所属的PHP类。因此闭包可以访问半丁闭包的对象中受保护和私有的成员变量。
字节码缓存(Zend OPcache)
- php是解释性语言,PHP解释器执行PHP脚本时会解析php脚本代码,把PHP代码编译成一系列Zend操作码,然后执行字节码。如果每次请求都必须不断解析,编译执行php脚本,会消耗很多的资源。字节码缓存能存储预先编译好的php字节码。这意味着,请求PHP脚本时,php解释器不用每次都读取,解析和编译php代码,直接从内存中读取预先编译的字节码,执行,可以节省很多时间。
内置的HTTP的服务器
*从php5.4.0起,PHP内置了web服务器,这个服务器知道怎么处理HTTP协议,能伺服静态资源和php文件,无需安装MAMP,WAMP等web服务器。
启动服务器器
- php -S host(主机名):port(端口号)
配置服务器
- 应用又是需要使用专属的php初始化配置文件,尤其是对内存用量,文件上传,分析or字节码缓存有特殊要求时要单独配置
php -S host(主机名):port(端口号) -c /path/php.ini
- 最好把自定义的初始化文件放在应用的根目录中,如果需要分享,可以把初始化文件纳入版本控制系统。
- 但是内置服务不支持.htaccess 文件,很难支持多数流行的PHP框架中常见的前端控制器。前端控制器的职责是转发所有的http请求,分发请求,调度适当php的代码。
- PHP内置web服务器不能在生产环境使用,她的性能不是最好的,一次只能处理一个请求,其他请求会受到阻塞。如果某个文件必须等待慢速的数据库查询or远程api返回响应,Web应用会处于停顿状态。
- 内置服务器只支持少量的媒体类型, 而且路由器脚本也只支持少量的URL重写规则。