【问题标题】:PHP: How to avoid defined() while checking if constant exists?PHP:如何在检查常量是否存在时避免定义()?
【发布时间】:2019-07-08 11:45:41
【问题描述】:

许多有经验的开发人员都知道函数 defined() 比任何其他检查慢 19 倍左右。

我遇到了一个问题,我需要有超过 5000 条记录的循环和 7 个defined() 在序列中的检查,并且该减速完成了项目。

在这种情况下,无法更改项目工作或分块的方式。是否有一些好的解决方案或想法如何避免defined() 功能?

【问题讨论】:

  • 没有进一步的上下文很难说。你用这些常量做什么?您的流程的哪一部分适合更改?但这听起来很奇怪。我相当低端的计算机在冷运行后的 26 毫秒内运行 7 * 5000 次定义检查的循环(下次执行时为 13 秒)。这真的是您需要完成的优化级别吗?
  • 计算一次defined() 并将结果存储到一个变量中。在循环中,检查变量。

标签: php performance


【解决方案1】:

你试过了吗

constant ( string $name ) : mixed

返回常量的值,如果不是常量则返回 NULL 已定义。

鉴于在 php 中 null == false

if (defined($name))

if (constant($name))

几乎相同
https://www.php.net/manual/en/function.constant.php

【讨论】:

  • 是不是更快...?
  • @deceze 这就是为什么我将其表述为“你试过了吗”。因为我找不到有关它们执行速度的信息。
  • 嗯...我没想到。 if(NUII !== constant('SOMETHING')) 可以是一些解决方案,但需要测试。会让你知道。谢谢!
  • @EinārsBistrovs 如果未定义常量并且比define()慢一倍,则会生成 E_WARNING 级别错误
【解决方案2】:

我测试了类似的东西:

if(!defined('TEST')) continue;

if(!@TEST) continue;

if(NULL === @constant('TEST')) continue;

我对 PHP 7.1 的衡量标准是:

if(!@TEST) continue;if(NULL === @constant('TEST')) continue;

但两者都比if(!defined('TEST')) continue;

似乎我们还没有更快的解决方案,defined() 仍然是检查常量是否存在的更快方法。

【讨论】:

    猜你喜欢
    • 2013-01-03
    • 2011-10-04
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2013-12-01
    • 2020-03-18
    相关资源
    最近更新 更多