Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/278.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中块外不可见的块内声明局部变量?_Php - Fatal编程技术网

如何在PHP中块外不可见的块内声明局部变量?

如何在PHP中块外不可见的块内声明局部变量?,php,Php,我是PHP新手,并且已经在Perl/C/Scheme方面有了一些经验,我发现我 不知道如何在块内定义变量,例如if/for/while,并使其在块外不可见 我是否必须将块中的代码放入函数中才能使其成为本地代码 例如,我的很多bug都是由以下代码引起的: <?php for($id = 0; $id<10; $id++) { $a = $id; } if(1) { $b = 3; } echo $a

我是PHP新手,并且已经在Perl/C/Scheme方面有了一些经验,我发现我 不知道如何在块内定义变量,例如if/for/while,并使其在块外不可见

我是否必须将块中的代码放入函数中才能使其成为本地代码

例如,我的很多bug都是由以下代码引起的:

<?php
    for($id = 0; $id<10; $id++)
    {
        $a = $id;
    }
    if(1)
    {
        $b = 3;
    }
    echo $a;//9
    echo $id;//10;
    echo $b;//3
?>

但是,在perl中,这样的代码是安全的:

#!/usr/bin/perl
use 5.014;
use strict;
use warnings;
for(my $id = 0; $id < 10; $id++)
{
    my $a = $id;
}
if(1)
{
    my $b = 3;
}
#say $a; #error
#say $b; #error
#say $id; #error
#/usr/bin/perl
使用5.014;
严格使用;
使用警告;
对于(我的$id=0;$id<10;$id++)
{
my$a=$id;
}
如果(1)
{
我的$b=3;
}
#一美元#错误
#比如说b美元#错误
#比如$id#错误
在C中,这样的代码将导致err(使用-std=gnu99编译)

#包括
int main()
{

对于(inti=0;i,在每个块的末尾使用
unset($var);

这在PHP中非常重要,我个人有很多与此相关的bug

一种方法是在块的末尾取消设置()变量

<?php
    for($id = 0; $id<10; $id++)
    {
    $a = $id;
    }
    if(1)
    {
        $b = 3;
        unset($b);
    }
    echo $a;//9
    echo $id;//10;
    echo $b;//unset notice
?>


或者在使用变量之前将其赋值为null。

有几种可能的方法,但它们基本上都可以归结为:将代码分解为函数。不管是哪种方法,它都会回到这一点。不管PHP缺少块作用域,对于可维护和可重用的代码,无论如何都应该这样做

  • 使用具有尽可能小且自包含的方法的类
  • 使用尽可能小且独立的函数
  • 切勿使用
    全局
  • 不要写太长的过程代码,不管它是否在一个函数中。如果一个作用域长于一个代码屏幕,那么它很可能太长,可能会被分解
  • 使用合理的描述性变量名,在每个作用域的顶部对它们进行初始化,不要在整个作用域中出于不同的目的重用它们
  • 更多地考虑映射操作、迭代器和回调,例如:

    // Look ma, no $i or other superfluous iterator variables!
    $foo = array_map(function ($bar) { return /* something */; }, $baz);
    
    $foo = array_reduce($bar, function ($foo, $baz) { return /* something */; });
    
    $files = new RecursiveIteratorIterator(
        new RecursiveCallbackFilterIterator(
            new RecursiveDirectoryIterator(__DIR__),
            function ($file) { return /* something */; }
        )
    );
    foreach ($files as $file) {
        /* A lot of code that would have gone here is in the
           RecursiveCallbackFilterIterator callback now. */
    }
    
  • 一般来说,这些天你会看到最健全的PHP代码广泛使用依赖注入OOP,由许多小类和许多小方法组成。这最大限度地提高了代码的可重用性、灵活性并减少了问题

    作为一种丑陋的黑客手段,您可以通过模拟IIFEs的常见Javascript实践来人为引入作用域:

    $foo = call_user_func(function () {
        /* your variables here */
        return $result;
    });
    

    这可能适用于一次性脚本,这些脚本本质上很长,而且是程序性的,但您仍然希望按范围进行分离。不过,我并不建议您一般采用这种做法。

    将您的块切割成函数,这样它就有了范围?您最好使用一些变通方法,通过改变您在编码时的思维方式:pHP!==Perl&&PHP!==cb通过保持函数和作用域较小,不为不同目的重复使用作用域内的变量名,并在作用域顶部初始化变量。如果作用域太大,您必须搜索多个不同的文件,则作用域太大。如果您正在编写较长的过程所有脚本,然后就是你的问题了,或者把它分解成更小的函数,或者采用面向对象的方法,你就不会有这个问题了。实际上这是我使用的方法,如果(isset($var)){die('errmsg”)}…unset($var)…你没有使用unset()使用这种方式,我只能确保我的变量不会污染其他变量,但我不能确保我的变量不会被其他人污染。。。
    $foo = call_user_func(function () {
        /* your variables here */
        return $result;
    });