gpt4 book ai didi

php - 引用 : What is variable scope, 哪些变量可以从哪里访问,什么是 "undefined variable"错误?

转载 作者:IT老高 更新时间:2023-10-28 11:42:48 29 4
gpt4 key购买 nike

Note: This is a reference question for dealing with variable scope in PHP. Please close any of the many questions fitting this pattern as a duplicate of this one.



PHP 中的“变量范围”是什么?一个 .php 文件中的变量是否可以在另一个文件中访问?为什么我有时会收到“ undefined variable ”错误?

最佳答案

什么是“可变范围”?

变量具有有限的“范围”或“可访问的位置”。就因为你写了$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
<?php

$foo = 'bar';

b.php
<?php

include 'a.php';

echo $foo; // works!

相同的规则适用于 include d 代码适用于任何其他代码:仅 function s 单独的范围。出于范围的目的,您可能会考虑包含诸如复制和粘贴代码之类的文件:

php
<?php

function myFunc() {
include 'a.php';

echo $foo; // works
}

myFunc();

echo $foo; // doesn't work!

在上面的例子中, a.php被包含在 myFunc , a.php 中的任何变量只有局部函数作用域。仅仅因为它们似乎在 a.php 中的全局范围内并不一定意味着它们是,它实际上取决于包含/执行代码的上下文。

函数和类中的函数呢?

每新 function声明引入了一个新的作用域,就这么简单。

函数内的(匿名)函数
function foo() {
$foo = 'bar';

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

// no access to $baz
}

类(class)
$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?!?!!

没有迹象表明此功能有任何副作用,但确实如此。这很容易变成一团糟,因为一些函数不断修改并需要一些全局状态。您希望函数是无状态的,只对它们的输入起作用并返回定义的输出,无论您调用它们多少次。

您应该尽可能避免以任何方式使用全局作用域;当然,您不应该将全局范围内的变量“拉”到局部范围内。

关于php - 引用 : What is variable scope, 哪些变量可以从哪里访问,什么是 "undefined variable"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16959576/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com