检查变量相关的函数

我们平常开发中, 如同 isset 这样检查是否存在的函数, 通常有三个: isset, empty, in_array, array_key_exists

今天, 来尝试分析这三个函数各自的最佳使用场景, 并比较他们的效率

isset

isset - 检测变量是否已声明并且值不为NULL

isset其实是语句, 而非函数

echo, print一样, 是php本身的一种语言结构

比如, for, foreach, continue 等等, 它们在语法分析的时刻就被”抹掉”(逻辑上替代了)了.

让我们看看isset这个语句在语法分析的过程中, 是如何被”抹掉”的.

  1. 首先, 在词法分析的时候, isset会被识别为T_ISSET标识符.
  2. 而在语法分析阶段, 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秒多秒。

issetarray_key_exists 均为1秒左右。

in_array 中, 进行的是循环对数组遍历, 因而其所费的时间要多

issetarray_key_exists 是将变量认为是Hash进行判断, 因而所费时间极短

  1. 过滤特殊字符
  2. 过滤数据库关键字
  3. 验证数据类型以及格式
  4. 使用预处理 (mysqli, pdo都可以使用prepare方法进行预处理), 编写时通过占位符对值进行占位, 绑定变量

函数嵌入

1
2
3
4
5
6
7
8
9
10
11
12
13
function a($a_char) {
function b($b_char) {
function c($c_char) {
return $c_char;
}
return $b_char;
}
return $a_char;
}

echo a('a') . PHP_EOL; // 若不调用a函数 则无法调用b函数
echo b('b') . PHP_EOL; // 若不调用b函数 则无法调用c函数
echo c('c');
  1. 请求进入nginx
  2. nginx将请求转发到phpfpm
  3. phpfpm主进程fork一个子进程来执行该请求
  4. cgi程序解析对应的index.php

—- thinkphp6的请求流程 —-

  1. 载入Composer, 自动加载依赖库
  2. 实例化基础类App, 在App类构造函数时
    1. 保存了应用目录的路径
    2. 并将app目录下的provider.php覆盖写入到app实例
  3. 回到index.php, 调取容器中的http类
    1. 会通过实例app的魔术方法__get获取
    2. 再通过make方法创建对应的http实例, make方法会通过反射来new实例, tp支持了反射回调, invokeCallback
    3. http的构造方法中, 通过成员变量将app类实例的引用写入进来
  4. 调取http类实例的run方法
    1. 调取http类实例的初始化方法 initialize
      1. 通过成员变量$app, 调取app类实例的初始化方法initialize
    2. 通过成员变量$app, 去调取app类实例的make方法, 创建一个\think\request类实例

使用JSON函数

今天来说说两个函数 json_encodejson_decode

json_encode

json_decode

// 返回json中以适当PHP类型编码的值。true、false和null值分别作为true、false和null返回。
// 如果json无法解码,或者编码的数据比递归限制更深,则返回NULL。

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列出的包。