【问题标题】:Checking if a static variable is Null after setting it to null在将静态变量设置为 null 后检查它是否为 Null
【发布时间】:2017-07-10 15:57:52
【问题描述】:

最近,当我下载一个开源项目时,我偶然发现了这段 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,以防它有影响。有人可以解释一下吗?

【问题讨论】:

    标签: php oop variables scope null


    【解决方案1】:

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

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

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


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

    【讨论】:

    • 那么,如果问题是在编译时使用常量,为什么 PHP 不自动将 static $exists = \function_exists('mb_substr'); 编译成 static $exists = null; $exists = \function_exists('mb_substr');?或者这个特定的结构是否旨在作为“缓存”设计(检查一次\function_exists('mb_substr'),如果这个函数被重用,则存储结果(真或假但不是 Null)?
    • 嗯,它没有。是的,它应该是一个“缓存”并节省重复函数调用的开销。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2010-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多