PHP实用功能——modern PHP读书笔记(一)
PHP实用功能——modern PHP读书笔记
(原创内容,转载请注明来源,谢谢)
一、命名空间
1、命名空间按照虚拟的层次结构组织PHP代码,类似操作系统的目录结构。
2、定义命名空间的方式放在<?php后的第一行(除注释外),如果有需要导入的命名空间,其代码放于定义的后面,PHP解释器会将命名空间作为前缀加到类、接口、函数、常量名称前。
3、方式:
定义:namespace 路径二级路径.....; 这里的路径指的是虚拟的路径
导入:use 路径文件名(不用路径)类名 [as 别名]; 这里as可以重命名类名。
从PHP5.6开始,支持导入常量和方法,方法如下:
1)导入方法:use func…functionname;
2)导入常量:useconstant …constname;
4、不建议一个文件中定义两个命名空间。
5、如果定义了一个命名空间,那么在该文件中如果调用PHP原生类,则需要在类前面加入一个反斜杠,以此表示根命名空间下的类。例如要调用PHP的Exception类,应采用Exception()的方式。
二、性状(trait) PHP5.4
1、使用场景
当两个完全无关的类,需要实现同一个方法,则采用性状的方式最为合适。例如,现有汽车类和大楼类这两个类,都需要添加一个定位的功能,如果在两个类中分别去实现,代码重复率高,而且当有需要修改的时候还需要分别去修改,比较麻烦,则可以使用trait的方式进行操作。
2、使用方法
定义:
traittesttrait{
private $testprop;
public function testfunc(){
}
}
使用:
class testclass{
use testtrait;
public functiontestclassfunc(){
$this->testfunc();
}
}
三、生成器(generator) PHP5.5
1、优势
当需要操作大文件、大数组等占用大量内存的工作时,使用生成器,会对文件的逐行、数组的逐个内容进行读取,并且仅开辟一个内存空间,节省了大量的内存。
2、生成器相当于简化版的迭代器,它只能逐个读取,不能读取上一个,也不能快进,不能进行查询某一个内容,对于需要逐个操作的场景使用广泛,但是对于需要退后、快进等的场景则还是需要使用PHP SPL迭代器,或者自己写类来实现Iterator接口。
3、使用方式(关键字 yield)
定义:
functiontestfunc(){
for($i=0;$i<=100000;$i++){
yield $i;
}
}
使用:(只能使用foreach使用)
foreach(testfunc as $num){
echo $num;//会输出0-100000
}
上述场景中,如果使用常规的数组来接收0-100000,则需要一个空间为100001的数组用于保存内容,占用大量的空间。但是使用yield,则每次只用一个空间为1的数组来保存内容,当foreach到下一个内容时,仍使用该内存。
四、闭包PHP5.3
1、闭包与匿名函数在PHP中是同一个概念,都是PHPClosure类的实例,闭包函数设计的初衷是为了增加函数的复用性。
2、使用方式
定义:
$test= function($a){return $a+1;}
使用:
echo$test(1);//输出结果为2
3、当变量后面出现括号(),即当尝试以调用函数的方式调用一个对象时,则PHP会自动调用魔术方法__invoke()。
__invoke()示例:
classtestinvoke{
publicfunction __invoke($x){
echo $x;
}
}
$test = newtestinvoke();
$test(‘a’); //输出 a
4、在闭包中使用use(),可以使用闭包之外的变量,并且当闭包函数执行完毕时该变量仍在。
functiongetNames($lastname){
returnfunction($firstname) use ($lastname){
return $firstname.’’.$lastname;
}
}
$name =getNames(‘hxx’);
echo$name(‘lin’);//输出linhxx
5、闭包函数中使用bindTo()方法
五、Zend Opacache 字节码缓存(PHP 5.5)
该内容后续文章中讲解,先挖个坑。
六、PHP内置的web服务器
除了常用的Apache、Nginx外,PHP内部也有web服务器,但由于该服务器每次只能处理一个请求,不适用于生产系统,但是对于开发调试还是可以使用。
1、开启: php –s localhost:8000
2、加载自定义配置文件 php –s localhost:8000–c app/confing/php.ini
3、PHP查询当前使用的服务器名称的方式
echophp_sapi_name();//使用内置服务器,会输出 cli_server
——written by linhxx 2017.06.25
- 一个简单的MySQL数据迁移示例
- MySQL访问受限的问题分析
- 一个Oracle监听问题的网络排查
- MySQL InnoDB Cluster环境搭建和简单测试
- 多平台下的数据存储新秀-PROTOBUF
- TCP的长连接与短连接的含义与区别(附Java代码实现)
- Mycat读写分离配置实践
- 快速搭建主从的脚本和问题排查
- MySQL在RR隔离级别下的unique失效和死锁模拟
- Golang语言--glog日志库使用
- 一个MySQL死锁问题的复现
- Spring Boot 2.0 新特性(一):配置绑定 2.0 全解析
- MySQL断电恢复的一点简单分析
- Spring Boot 2.0 新特性(二):新增事件ApplicationStartedEvent
- php概述
- php教程
- php环境搭建
- PHP书写格式
- php变量
- php常量
- PHP注释
- php数组
- php字符串 string
- PHP整型 integer
- PHP浮点型 float
- php布尔型
- php数据类型之数组
- php数据类型之对象
- php数据类型之null
- php数据类型之间的转换
- php运算符
- php表达式
- PHP循环控制
- PHP流程控制
- php函数
- php全局变量
- PHP魔术变量
- php命名空间
- php 日期
- PHP包含文件
- php文件
- PHP 文件上传
- php Cookies
- php Sessions
- php email
- php安全email
- php错误处理
- PHP异常处理
- php过滤器
- PHP 高级过滤器
- php json
- php 表单
- PHP MySQL 简介
- PHP 连接 MySQL
- php创建数据库
- php 创建表
- php mysq 插入数据
- PHP MySQL 插入多条数据
- PHP MySQL 预处理语句
- php mysql 读取数据
- php mysql where
- PHP MySQL Order By
- PHP MySQL Update
- PHP MySQL Delete
- php ODBC
- 3行核心CSS代码的rate评分组件,秀到你怀疑人生
- 用 Rust 和 N-API 开发高性能 NodeJS 扩展
- 教你 Linux 免密登录配置
- Linux阅码场 - Linux内核月报(2020年08月)
- 事务的本质和死锁的原理
- 深度神经网络conda环境下载
- 隧道构建:端口转发的原理和实现
- SAP Spartacus注入自定义的CurrentProductService
- Redis系列(十一)redis命令全集
- Jinkens+gitlab针对k8s集群实现CI/CD
- Vue 踩过的坑
- Java TCP/UDP/HttpClient简例
- 让你设计实现一个签到功能,到底用MySQL还是Redis?
- 如何防止MySQL重复插入数据,这篇文章会告诉你
- Spring AOP注解开发