What is the scope of require_once in PHP?

后端 未结 4 1570
故里飘歌
故里飘歌 2021-01-08 01:08

Simple question: Is the scope of require_once global?

For example:



        
相关标签:
4条回答
  • 2021-01-08 01:41

    require_once() basically relies on the physical file to determine whether or not it's been included. So it's not so much the context that you're calling require_once() in, it's whether or not that physical file has previously been required.

    In your code above, your foo() function would not re-parse baz.php, since it is going to be the same file as was previously included at the top.

    However, you will get different results based on whether you included it inside foo(), or included it at the top, as the scoping will apply when require_once() does succeed.

    0 讨论(0)
  • 2021-01-08 01:41

    To more specifically answer your question, the second time you call require_once on that file, it won't do anything, because it's already be included.

    If your include has functions etc. in it, then you would have issues including it inside a function anyway, so scope is irrelevant. If it's just variables being defined or processed, then you can just use require instead of require_once if you want it to be included again, thereby redefining the variables in your scope.

    0 讨论(0)
  • 2021-01-08 01:44

    At least in PHP 7.3, require_once has global scope.
    If it would not, both x.php and z.php should throw errors as y.php does:

    a.php

    <?php function a() { require_once 'b.php'; b(); }
    

    b.php

    <?php function b() { debug_print_backtrace(); }
    

    x.php

    <?php
    require_once 'a.php';
    a();
    b();
    

    -->

    #0 c() called at [/var/www/b.php:2]  
    #1 b() called at [/var/www/a.php:3]  
    #0 c() called at [/var/www/a.php:4]  
    

    y.php

    <?php
    require_once 'a.php';
    b();
    

    --> Fatal error: Uncaught Error: Call to undefined function b() in /var/www/y.php on line 3

    z.php

    <?php
    require_once 'a.php';
    require_once 'b.php';
    b();
    

    -->

    #0 b() called at [/var/www/z.php:4]
    
    0 讨论(0)
  • 2021-01-08 01:58

    It does not. require_once's tracking applies to inside functions. However, the following scripts produce an error:

    a.php

    <?php
    require_once('b.php');
    function f() { require_once('b.php'); echo "inside function f;"; }
    ?>
    

    b.php

    <?php
    f();
    ?>
    

    because function f() is not pre-defined to b.php.

    0 讨论(0)
提交回复
热议问题