检查变量相关的函数
我们平常开发中, 如同 isset
这样检查是否存在的函数, 通常有三个: isset
, empty
, in_array
, array_key_exists
今天, 来尝试分析这三个函数各自的最佳使用场景, 并比较他们的效率
isset
isset
- 检测变量是否已声明并且值不为NULL
isset
其实是语句, 而非函数
和 echo
, print
一样, 是php本身的一种语言结构
比如, for, foreach, continue 等等, 它们在语法分析的时刻就被”抹掉”(逻辑上替代了)了.
让我们看看isset这个语句在语法分析的过程中, 是如何被”抹掉”的.
- 首先, 在词法分析的时候, isset会被识别为T_ISSET标识符.
- 而在语法分析阶段, isset($var)这个指令, 会被分析成一条Opcode:ZEND_ISSET_ISEMPTY_VARS.
你可以理解isset就想C语言里面的宏, 在编译/执行之前已经被展开了.
参考链接: isset和is_null的不同
empty
empty
其实与isset
相同, 也是语句
array_key_exists
in_array
比较效率
比较 isset、array_key_exists、in_array的效率
结果是 isset
> array_key_exists
> in_array
在有三万元素的情况下, in_array
的处理速度是8秒。
如果是严格模式的 in_array
, 时间减短为3秒多秒。
而 isset
和 array_key_exists
均为1秒左右。
在 in_array
中, 进行的是循环对数组遍历, 因而其所费的时间要多
isset
和 array_key_exists
是将变量认为是Hash进行判断, 因而所费时间极短
- 过滤特殊字符
- 过滤数据库关键字
- 验证数据类型以及格式
- 使用预处理 (mysqli, pdo都可以使用prepare方法进行预处理), 编写时通过占位符对值进行占位, 绑定变量
- 请求进入nginx
- nginx将请求转发到phpfpm
- phpfpm主进程fork一个子进程来执行该请求
- cgi程序解析对应的index.php
—- thinkphp6的请求流程 —-
- 载入Composer, 自动加载依赖库
- 实例化基础类App, 在App类构造函数时
- 保存了应用目录的路径
- 并将app目录下的provider.php覆盖写入到app实例
- 回到index.php, 调取容器中的http类
- 会通过实例app的魔术方法__get获取
- 再通过make方法创建对应的http实例, make方法会通过反射来new实例, tp支持了反射回调, invokeCallback
- http的构造方法中, 通过成员变量将app类实例的引用写入进来
- 调取http类实例的run方法
- 调取http类实例的初始化方法 initialize
- 通过成员变量$app, 调取app类实例的初始化方法initialize
- …
- …
- …
- …
- …
- …
- 通过成员变量$app, 调取app类实例的初始化方法initialize
- 通过成员变量$app, 去调取app类实例的make方法, 创建一个\think\request类实例
- 调取http类实例的初始化方法 initialize
Composer的工作原理
Composer是 PHP 用来管理依赖(dependency)关系的工具。
当我们执行 composer require
命令的时候,composer
会帮我们执行如下操作:
composer
会找到符合PSR4规范的第三方库的源- 将其加载到
vendor
目录下 - 初始化顶级域名的映射并写入到制定文件里;
- 写好一个
autoload
函数, 并且注册到spl_autoload_register()
里; - 然后我们就可以在我们的代码里
use
相应的命名空间和类
dump-autoload
某些情况下你需要更新 autoloader,例如在你的包中加入了一个新的类。你可以使用 dump-autoload 来完成,而不必执行 install 或 update 命令。
安装-参数
- –optimize-autoloader (-o) : 转换 PSR-0/4 autoloading 到 classmap 可以获得更快的加载支持。生产环境下建议,运行需要时间,因此并非默认值。
- –no-dev : 跳过安装require-dev列出的包。