php - 将静态变量设置为 null 后检查其是否为 Null

标签 php oop variables scope null

最近,当我下载一个开源项目时,我遇到了这个 PHP 代码:

<?php

namespace That\Thing;

final class Somewhere
{
  //...

  public static function somefunc( /*...*/ )
  {
    static $exists = null;
    if ($exists === null) {
      $exists = \function_exists('mb_substr');
    }

    if ($exists) {
      //...

我的PHP没问题,所以读了上面的内容后,我很困惑static $exists = null到底是做什么的?将变量设置为 Null,然后立即检查变量是否实际上为 Null,对我来说没有意义? (在这里添加 Duhh)

这里是否正在进行某种 PHP 版本检查?为什么有人要写这段代码?

我已经包含了周围的OOP,以防它有影响。有人能解释一下吗?

最佳答案

static 在函数调用之间保留变量值。但是,静态变量只能用常量值进行初始化。 不受支持(静态初始化程序中的函数调用):

static $exists = \function_exists('mb_substr');

因此,作为解决此问题的方法,变量被初始化为 null,然后如果值为 null(如果这是第一次访问该变量,则在初始化之后立即访问) ),它被设置为其实际值。


static 值在运行时之前的编译阶段初始化。因此,此时不能调用运行时函数或进行其他过于复杂的运行时计算。 static $exists = null 发生在编译时;然后第一次调用该函数时,将完成运行时计算。

关于php - 将静态变量设置为 null 后检查其是否为 Null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45016653/

相关文章:

javascript - 如何正确评估字符串变量作为 jQuery.post() 中的数据

php - 是否可以获取终端的宽度或打印填充 100% 宽度的线条?

c# - 不知道类型时如何指定类型化变量

php - PHP中的父::父

python - 增加循环内范围的上限不会使其永远运行

c++ - Visual Studio 。调试。如何将变量在运行期间拥有的所有值保存到文件中?

php - UploadedFile getPathname 为空

php - 为什么 PHP 的 foreach 将其数组的指针(仅)前进一次?

matlab - 在 MATLAB 的抽象类中声明 function_handle 类型的属性的正确方法是什么?

JavaScript:未更新变量的动态值。为什么会这样?