Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP:为什么使用'global'比在函数中声明变量慢?_Php_Variables_Global - Fatal编程技术网

PHP:为什么使用'global'比在函数中声明变量慢?

PHP:为什么使用'global'比在函数中声明变量慢?,php,variables,global,Php,Variables,Global,我一直在阅读PHP手册页面,但显然我读错了。我运行了一些简单的测试,看看哪种获取变量的方法更快:使用global,在函数中声明变量,或者使用声明的常量 摘要: <?php $start = microtime(true); //Put (1) or (2) here... for($i=0; $i<10000; $i++){ buildSKU(); } $end = microtime(true) - $start; echo "\n\nTime: ".$end."\nMemory

我一直在阅读PHP手册页面,但显然我读错了。我运行了一些简单的测试,看看哪种获取变量的方法更快:使用
global
,在函数中声明变量,或者使用声明的常量

摘要:

<?php

$start = microtime(true);
//Put (1) or (2) here...
for($i=0; $i<10000; $i++){ buildSKU(); }
$end = microtime(true) - $start;
echo "\n\nTime: ".$end."\nMemory:".memory_get_peak_usage(true)."\n\n";
  • 声明变量(例如,
    $keyspace=012…;
    )最快
  • 使用
    global
    (例如,
    global$keyspace;
  • 定义常量(例如,
    define('keyspace','01234…');
    是最慢的
  • 问题: 为什么使用
    global
    define
    比在PHP中声明变量慢

    (1)在函数外部定义的变量,函数使用
    global

    $keyspace = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    function buildSKU(){
            global $keyspace;
            $sku = '';
            $max = mb_strlen($keyspace, '8bit') - 1;
            for ($i = 0; $i < 8; ++$i) {
                    $sku .= $keyspace[random_int(0, $max)];
            }
            return $sku;
    }
    
    $keyspace='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    函数buildSKU(){
    全球$keyspace;
    $sku='';
    $max=mbstrlen($keyspace,'8bit')-1;
    对于($i=0;$i<8;++$i){
    $sku.=$keyspace[random_int(0,$max)];
    }
    返回$sku;
    }
    
    (2)函数内部定义的变量

    function buildSKU(){
            $keyspace = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            $sku = '';
            $max = mb_strlen($keyspace, '8bit') - 1;
            for ($i = 0; $i < 8; ++$i) {
                    $sku .= $keyspace[random_int(0, $max)];
            }
            return $sku;
    }
    
    函数buildSKU(){
    $keyspace='0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $sku='';
    $max=mbstrlen($keyspace,'8bit')-1;
    对于($i=0;$i<8;++$i){
    $sku.=$keyspace[random_int(0,$max)];
    }
    返回$sku;
    }
    
    (3)定义为常数的变量

    define('keyspace', '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    function buildSKU(){
            $sku = '';
            $max = mb_strlen(keyspace, '8bit') - 1;
            for ($i = 0; $i < 8; ++$i) {
                    $sku .= keyspace[random_int(0, $max)];
            }
            return $sku;
    }
    
    define('keyspace','0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ');
    函数buildSKU(){
    $sku='';
    $max=mb_strlen(键空间'8bit')-1;
    对于($i=0;$i<8;++$i){
    $sku.=键空间[random_int(0,$max)];
    }
    返回$sku;
    }
    
    我的试验台:

    <?php
    
    $start = microtime(true);
    //Put (1) or (2) here...
    for($i=0; $i<10000; $i++){ buildSKU(); }
    $end = microtime(true) - $start;
    echo "\n\nTime: ".$end."\nMemory:".memory_get_peak_usage(true)."\n\n";
    

    我认为global的主要问题是依赖性问题,即您的整个代码库将依赖于该全局变量及其存在,随着代码的增长,很难跟踪和排除故障。即使更改名称,也需要更改代码中的任何地方


    如果你的代码没有改变,也许你应该考虑使用常量。

    你的标题有点误导。函数变量没有被“反复声明”,它在编写函数代码时被声明过一次。你还把注意力放在了苹果与橘子的比较上。

    在函数变量示例中,变量的作用域完全不同。函数中声明的局部变量不再存在(至少从作用域的角度来看)函数完成后,它也将被初始化,这与全局示例不同,全局示例中函数开头的变量状态完全未知

    你花了很多时间研究微观优化和一个毫无意义的基准,而答案要简单得多。最好使用
    global
    关键字将变量注入函数范围

    你有可以通过引用或值传递的参数,但你没有评估这些选项,尽管我必须重申,在我看来,你不会真正发现任何有趣的东西

    在大多数创建编译程序的语言中,函数变量是在堆栈上分配的。函数完成后,该内存区域将从堆栈中弹出并丢弃。然而,PHP有一个变量命名和内存分配方案,可在所有变量和对象之间共享。您可以搜索有关“PHP zval”的信息和php内部,并通过符号表了解更多关于变量分配、引用计数以及与名称关联的方式

    这里要强调的重要一点是,无论变量的类型如何,变量分配都以相同的方式进行,因此,纯粹基于变量分配语法的任何性能预期都不可能提供任何有意义的差异


    PHP会做出各种各样的决定,决定何时需要创建一个新的zval,或者简单地将多个符号指向同一个符号,这对您来说是透明的。

    始终使用局部变量,除非它是绝对需要的,并且没有其他方法。

    如果它在请求过程中不会改变,那么常量可能不会改变更好的选项。全局被认为是不好的做法。我更愿意将其作为参数传递给函数,将其设置为类属性,或者将其放入配置文件并以这种方式吸收。@JonStirling,使用常量的结果出人意料地慢(尽管也不是很慢)@JBH如果您担心效率水平,请停止:声明为
    global
    的PA变量应该比局部变量慢一点,因为它实际上是一个局部变量,用于存储对来自不同范围的变量的引用。我感谢您花时间指出我在理解如何我不是一个编译器的人,但你不知道这一点,因此你对我在这方面的局限性的警告是可以理解的。我没有试图优化任何东西,只是试图通过使用我有限的能力设计的测试来更好地理解PHP操作的差异关系。我很感激你给了我启发,使我可以忽略整个情况,这是一个完全合适的答案。很高兴它起到了帮助作用,也许还为你指出了一些你可能会感兴趣的关于php内部的材料。