什么是变量作用域,哪些变量可以从哪里访问,什么是“未定义的变量”errors?

Php 中的“变量作用域”是什么? 是一个变量。 可以访问另一个 php 文件? 为什么有时会出现“未定义变量”错误?

什么是“变量范围” ?
变量有一个有限的“作用域” ,或者“能访问地方”。 仅仅因为你写了$foo = 'bar'; 在你的应用程序中的某个地方,并不意味着你可以从应用程序中的其他地方引用$foo。 变量 $foo有一个特定的作用域,在这个作用域中它是有效的,只有同一作用域中的代码才能访问这个变量。
如何在 PHP 中定义作用域?
非常简单: PHP 有函数作用域。这是 PHP 中存在的唯一一种作用域分隔符。 函数内部的变量只能在函数内部使用。函数之外的变量可以在函数之外的任何地方获得,但是在任何函数之内不可以。这意味着 PHP 有一个特殊的作用域: 全局作用域。在任何函数之外声明的任何变量都在这个全局范围内。
例:

<?php
$foo = 'bar';
function myFunc() {
    $baz = 42;}

$foo 位于全局作用域中,$baz 位于 myFunc 中的本地作用域中。 只有 myFunc 中的代码可以访问 $baz。 只有 myFunc 之外的代码才能访问 $foo。 两者都无法彼此获取:

<?php
$foo = 'bar';
function myFunc() {
    $baz = 42;
    echo $foo;  // doesn't work
    echo $baz;  // works}
echo $foo;  // works
echo $baz;  // doesn't work

作用域和文件
文件没有单独的作用域:

<?php
$foo = 'bar';
<?php
include 'a.php';
echo $foo;  // works!

同样的规则适用于include代码,就像适用于任何其他代码一样: 只有 function可以有单独作用域。对于作用域,您可以考虑包含像复制和粘贴代码这样的文件:

<?php
function myFunc() {
    include 'a.php';
    echo $foo;  // works}
myFunc();
echo $foo;  // doesn't work!

在上面的例子中,a.php 包含在 myFunc 中,a.php 中的任何变量都只有局部函数作用域。 仅仅因为它们看起来在 a.php 的全局作用域中并不一定意味着它们是全局作用域,这实际上取决于代码包含 / 执行在哪个context中。
函数和类中的函数是什么?
每个新的function都会引入一个新的作用域,就是这么简单。
函数内部的(匿名)函数

function foo() {
    $foo = 'bar';
    $bar = function () {
        // no access to $foo
        $baz = 'baz';
    };
    // no access to $baz}

$foo = 'foo';
class Bar {
    public function baz() {
        // no access to $foo
        $baz = 'baz';
    }
}
// no access to $baz

作用域有什么好处?
处理作用域问题可能看起来很烦人,但是对于编写复杂的应用程序来说,有限的变量作用域是必不可少的!如果您引入的每个变量都可以从应用程序中的其他任何地方获得,那么您就是在遍历所有的变量,而没有真正的方法来跟踪哪些变量发生了改变。可以给变量起的合理名称有限,您可能希望在多个地方使用变量“ $name”。 如果你只能在你的应用程序中使用一次这个唯一的变量名,那么你就不得不求助于真正复杂的命名来确保你的变量是唯一的,并且你没有从错误的代码片段中更改错误的变量。
看:

function foo() {
    echo $bar;}

如果没有作用域,上面的函数将做什么? $bar 从何而来? 它的状态是什么? 它是否被初始化了?你每次都要检查吗?不可能啊。接下来就是
跨越作用域的界限
正确的方法是: 传入和传出变量

function foo($bar) {
    echo $bar;
    return 42;}

变量 $bar作为函数参数进入这个范围。单看这个函数,就可以清楚地看到它的值是从哪里来的。 后返回一个值。 调用者就会知道函数将使用什么变量以及返回值从哪里来:

$baz   = 'baz';
$blarg = foo($baz);

将变量的作用域扩展为匿名函数

$foo = 'bar';

$baz = function () use ($foo) {
    echo $foo;};
$baz();

匿名函数显式地包含周围作用域中的 $foo。 请注意,这与全局作用域不同。
错误的方式: global
如前所述,全局作用域有些特殊,函数可以从中导入变量:

$foo = 'bar';
function baz() {
    global $foo;
    echo $foo;
    $foo = 'baz';}

这个函数使用和修改全局变量 $foo。 不要这样做! (除非你真的真的真的知道你在做什么,即使那样: 也不要!)
这个函数的调用者看到的是:

baz(); // outputs "bar"
unset($foo);
baz(); // no output, WTF?!
baz(); // outputs "baz", WTF?!?!!

没有迹象表明这个功能有任何副作用,但它确实有。当一些函数不断修改并需要某些全局状态时,这很容易变成一团乱麻。您希望函数是无状态的,无论您调用它们的次数多少只对它们的输入执行操作,并返回定义的输出。
您应该尽可能地避免使用全局作用域; 当然,您不应该将变量从全局作用域“拉”到局部作用域中。

一、什么是变量作用域
1、定义在函数外部的就是全局变量,它的作用域从定义处一直到文件结尾。
2、函数内定义的变量就是局部变量,它的作用域为函数定义范围内。
3、函数之间存在作用域互不影响。
4、函数内访问全局变量需要 global 关键字或者使用 $GLOBALS[index] 数组
例如:

<?php
$x=5;
$y=10;

function myTest()
{
    global $x,$y;
    $y=$x+$y;
}

myTest();
echo $y; // 输出 15
?>

二、什么是“未定义的变量”
图片说明
之所以会出现undefined,比如你在提交一个表单时,把获取表单的代码定义到了提交表单代码的上面,简单说就是你还没有提交表单呢,就想获取到表单内容,这时就会出现未定义的错误。