我应该声明并检查 PHP 中是否存在变量吗?

2024-03-21

我注意到 XAMPP 上启用了严格的错误报告,并且现在出现未定义的索引错误。我只有两个小问题(我还在学习):

我知道你不知道have在 PHP 中声明变量,但是声明它们有什么好处吗?如果不是,为什么在我未定义错误的情况下启用严格错误报告时会出现错误?

例如,当我使用 get 变量时,我会在运行类似函数之前检查它们的值

if($_GET['todo'] == 'adduser')
    runFunctionAddUser();

这会产生错误,因为我从不首先检查 get 变量是否存在。我应该做什么

if(isset($_GET['todo']))
    if($_GET['todo'] == 'adduser')
        runFunctionAddUser();

反而?这样做会有好处吗?还是不必要且缓慢?


该线程有点旧,但我做了一些与该问题相关的测试,所以我不妨发布它:

测试代码(PHP 5.3.3 - CentOS 版本 6.5(最终版)):

class NonExistant
{
    protected $associativeArray = array(
        'one' => 'one',
        'two' => 'two',
        'three' => 'three',
        'four' => 'four',
        'five' => 'five',
        'six' => 'six',
    );

    protected $numIterations = 10000;

    public function noCheckingTest()
    {
        for ($i = 0; $i < $this->numIterations; $i++) {
            $this->associativeArray['none'];
        }
    }

    public function emptyTest()
    {
        for ($i = 0; $i < $this->numIterations; $i++) {
            empty($this->associativeArray['none']);
        }
    }

    public function isnullTest()
    {
        for ($i = 0; $i < $this->numIterations; $i++) {
            is_null($this->associativeArray['none']);
        }
    }


    public function issetTest()
    {
        for ($i = 0; $i < $this->numIterations; $i++) {
            isset($this->associativeArray['none']);
        }
    }

    public function arrayKeyExistsTest()
    {
        for ($i = 0; $i < $this->numIterations; $i++) {
            array_key_exists('none', $this->associativeArray);
        }
    }
}

结果是:

| Method Name                              | Run time             | Difference
=========================================================================================
| NonExistant::noCheckingTest()            | 0.86004090309143     | +18491.315775911%
| NonExistant::emptyTest()                 | 0.0046701431274414   | +0.95346080503016%
| NonExistant::isnullTest()                | 0.88424181938171     | +19014.461681183%
| NonExistant::issetTest()                 | 0.0046260356903076   | Fastest
| NonExistant::arrayKeyExistsTest()        | 1.9001779556274      | +209.73055713%

所有函数的调用方式都与via相同call_user_func()并定时与microtime(true)

观察结果

empty() and isset()明显优于其他两种方法,这两种方法与性能几乎紧密相关。

is_null()表现不佳,因为它需要首先查找值,与访问不存在的值几乎相同$this->associativeArray['none'],这涉及到数组的完整查找。

然而,我对它的表现感到惊讶array_key_exists()。其速度慢 2 倍empty() and isset().

NOTE:

我测试过的所有函数都有不同的用途,这个基准仅适用于您想要快速检查数组中的值的最通用用例。我们可以讨论是否null应该被视为一个“值”或只是不存在的指标,但这是另一个话题。 o.o

更新2017-01-20

使用 PHP 7.1

修复了@bstoney 提到的错误

$ php -v
PHP 7.1.0 (cli) (built: Dec  2 2016 03:30:24) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.1.0-dev, Copyright (c) 1998-2016 Zend Technologies
$ php -a
php > $a = ['one' => 1, 'two' => 2, 'three' => 3];
php > $numIterations = 1000000;
php > $start = microtime(true); for ($i = 0; $i < $numIterations; $i++) { $a['none']; }; echo microtime(true) - $start;
0.43768811225891
php > $start = microtime(true); for ($i = 0; $i < $numIterations; $i++) { empty($a['none']); }; echo microtime(true) - $start;
0.033049821853638
php > $start = microtime(true); for ($i = 0; $i < $numIterations; $i++) { is_null($a['none']); }; echo microtime(true) - $start;
0.43995404243469
php > $start = microtime(true); for ($i = 0; $i < $numIterations; $i++) { isset($a['none']); }; echo microtime(true) - $start;
0.027907848358154
php > $start = microtime(true); for ($i = 0; $i < $numIterations; $i++) { array_key_exists('none', $a); }; echo microtime(true) - $start;
0.049405097961426
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该声明并检查 PHP 中是否存在变量吗? 的相关文章

随机推荐

  • 迭代Go地图获取索引

    为了使用revel s even https revel github io manual templates html even模板中的关键字我想在迭代时获取地图条目的索引range 有什么办法可以做到吗 我的地图具有以下结构 map s
  • dequeueReusableCellWithReuseIdentifier: 和 cellForItemAtIndexPath: 之间的区别

    我一直想知道为什么我的代码可以很好地工作cellForItemAtIndexPath 不与dequeueReusableCellWithReuseIdentifier 在获取集合视图单元格时 这是我的代码 这个效果很好 NSInteger
  • 为连续序列和分割向量创建分组变量

    我有一个向量 例如c 1 3 4 5 9 10 17 29 30 我想将形成规则 连续序列的 相邻 元素分组在一起 即在参差不齐的向量中增加 1 结果是 L1 1L2 3 4 5L3 9 10 L4 17L5 29 30 天真的代码 前 C
  • 如何确定 Qt 5 中的 QtWebEngine 在运行时使用的是哪个 chromium 版本?

    我在 Qt 5 中找不到任何函数来确定使用哪个 chromium 版本QtWebEngine 我不想在代码中硬编码 chromium 版本 因为我经常更新我的应用程序 并且每个版本中的 chromium 版本通常都会更改 而且 Qt 是向后
  • 目录相对 ZwCreateFile

    我必须为我的大学项目实施交叉视图文件完整性检查器 为此 我如何在内核模式下列出目录的文件 你的起点是ZwCreateFile http msdn microsoft com en us library windows hardware ff
  • 如何使用 ComPtr 中包装的 Direct3D 11 指针来获取 11.1 接口?

    我正在遵循教程 并将通常的初始化转换为使用 ComPtrs 直到这一行 ID3D11Device g pd3dDevice nullptr ID3D11Device1 g pd3dDevice1 nullptr Obtain the Dir
  • TriangleMesh JavaFX 中 getNormals() 方法的用途是什么

    我目前正在开发 JavaFX 3D 应用程序 并在 TriangleMesh 类中遇到 getNormals 方法 正如 Triangle Mesh 类用于创建用户定义的 Java FX 3D 对象一样 其中getPoints 用于添加Po
  • Python:subprocess.Popen() 的第一个实例非常慢

    我确信我错过了一些简单的东西 但是当使用子进程模块时 启动第一个子进程需要等待一段非常长的时间 gt 10 秒 第二个在第一个之后不久开始 有没有什么办法解决这一问题 代码如下 编辑 要添加 HWAccess 在 proc py 中 链接一
  • 如何将音频文件录制为 .m4a 格式?

    如何将音频文件录制为 m4a 格式 我正在使用下面的代码 public void startRecording throws IOException recorder new MediaRecorder path sdcard pithys
  • PyCharm:Scapy 未解决的参考

    我正在开发一个使用 scapy 用 python 编写的网络工具 我使用 Pycharm 作为 IDE 我的代码有效 因此 如果我运行它 一切都会按预期进行 我的问题是 PyCharm 给了我一些错误 它标志着每次使用IP TCP Ethe
  • 将 scanf 与 x86-64 GAS 组件结合使用

    我在尝试调用系统函数 scanf 以在我的 x86 汇编程序中工作时遇到了很多问题 目前我已经让它从标准中读取 但是它只会读取没有段错误的字符 我不知道为什么 指定字符串是 d 我在网上看到的 x86 中的 scanf 示例使用 quark
  • Git 忽略文件,而不删除它

    我有一个使用 GIT 进行版本控制的网站 我设置了一个系统 基本上可以自动部署我的更改master分支到我的生产服务器 也就是说 我的存储库中有一个 Web 挂钩 它会触发一个 PHP 脚本 该脚本本质上会启动一个git pull在服务器上
  • WatiN 搜索 google 后找不到文字

    我正在尝试运行一个简单的等待示例 搜索谷歌然后验证搜索结果 在 IE9 上 var browser new IE http www google com ncr browser TextField Find ByName q TypeTex
  • 从用于计算三角形和外接圆的 Swingworker 中重新绘制小程序

    我正在尝试复制找到的小程序here http www diku dk hjemmesider studerende duff Fortune 作为练习的一部分 该小程序使用 财富 的算法来生成两者 Voronoi 图和 Delaunay 三
  • 大背景图像和屏幕尺寸

    我正在创建一个网站 该网站将使用无法平铺的图像 我需要这张图像覆盖整个背景屏幕 但是 我希望它能够在大型显示器和小型显示器上运行 我应该制作一张大背景图像并使用它缩小它吗background size或者我应该创建不同尺寸的同一图像的多个版
  • 当定义需要 import 语句时,如何扩展现有接口?

    我创建了一个自定义 Knockout 扩展器 但在扩展 Knockout 定义文件提供的现有接口时遇到了问题 扩展器 Numeric ts import as ko from knockout function Extender targe
  • 关于如何以编程方式从 json 文件开始创建自定义 org.apache.spark.sql.types.StructType 架构对象

    我必须使用 json 文件中的信息创建一个自定义 org apache spark sql types StructType 架构对象 json 文件可以是任何内容 所以我在属性文件中对其进行了参数化 属性文件如下所示 ruta al es
  • 来自 Bitbucket 的“Go Get”私人仓库

    所以基本上 我有一个 Openshift 项目 在 Git 推送上 使用 Go get 下载所有库并即时构建项目 因此 我有一些代码不希望人们从我自己的库中看到 为了正确编译 代码需要从 github com 或另一个存储库获取 所以我创建
  • Ant 不可变属性到可变属性

    我有个问题 我正在使用 maven 的 antrun 插件 然后执行下一步 我有文件夹和子文件夹 我不知道什么叫子文件夹及其编号 我用它们的名称对此子文件夹进行存档 子文件夹名称 1 存档名称 1 acp
  • 我应该声明并检查 PHP 中是否存在变量吗?

    我注意到 XAMPP 上启用了严格的错误报告 并且现在出现未定义的索引错误 我只有两个小问题 我还在学习 我知道你不知道have在 PHP 中声明变量 但是声明它们有什么好处吗 如果不是 为什么在我未定义错误的情况下启用严格错误报告时会出现