注意:这是在PHP中处理变量范围的参考问题。请关闭所有适合此模式的问题,以作为该问题的重复。
PHP中的“可变范围”是什么?一个.php文件中的变量可以在另一个文件中访问吗?为什么有时会出现 “未定义变量” 错误?
变量具有有限的“作用域”或“可从其访问的位置”。仅仅因为你写$foo = 'bar';
一次 的地方 在你的应用程序并不意味着你可以参照$foo
从
到处 其他的应用程序中。该变量$foo
在一定范围内有效,并且只有相同范围内的代码才能访问该变量。
很简单: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
文件边界 不能分开 范围:
a.php
<?php
$foo = 'bar';
b.php
<?php
include 'a.php';
echo $foo; // works!
include
d代码与其他任何代码均适用相同的规则:仅适用于function
s单独的范围。出于范围的目的,您可能会考虑包括诸如复制和粘贴代码之类的文件:
c.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
}
$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?!?!!
没有迹象表明该功能有任何 副作用 ,但是确实有。由于某些函数不断修改 并需要 某些全局状态,因此这很容易成为一团糟。您希望函数是 无状态的
,仅对它们的输入起作用并返回定义的输出,无论您多次调用它们。
您应该尽可能避免以任何方式使用全局范围;最肯定的是,您不应该将变量从全局范围“拉”到局部范围。
考虑这两个Python文件: 人们会期望他们做完全相同的事情。但他们没有! 为什么的定义可以访问全局范围,而不能访问的范围? 为什么应该工作,而不应该工作?这是一个设计决策,还是CPython未定义的行为? 在计算类变量的值时,哪些变量/作用域可以访问的一般规则是什么?我什么时候应该考虑允许在定义类变量时使用哪个范围
变量是计算机系统用于保存可变值的数据类型,我们可以直接通过变量名称来提取到对应的变量值。在 Linux 系统中,环境变量是用来定义系统运行环境的一些参数,比如每个用户不同的家目录(HOME)、邮件存放位置(MAIL)等。 值得一提的是,Linux 系统中环境变量的名称一般都是大写的,这是一种约定俗成的规范。 我们可以使用 env 命令来查看到 Linux 系统中所有的环境变量,执行命令如下: [r
问题内容: 我注意到当在try {}中使用以下变量时,例如,从最后我不能在它们上使用方法: 但是,如果将声明放置在Try {}之前的main()中,则程序编译时没有错误,那么有人可以指出解决方案/答案/解决方法吗? 问题答案: 在进入块之前,需要声明变量,以使它们在方法的其余部分范围内:
问题内容: 我读了这个问题不可变对象,并留下了关于不可变对象,并最终场一个问题: 为什么我们需要不可变类中的实例变量为最终变量? 例如,考虑以下不可变的类: 如果在上面的代码中没有set方法,而实例变量仅在构造函数中设置,为什么要求将实例变量声明为final? 问题答案: 有没有 要求 这样做的变量。但是,当您确实明确打算永远不更改变量时,通常这样做是一种好习惯,因为这不仅可以使变量避免错别字或其
本文向大家介绍C ++中的变量和变量类型是什么?,包括了C ++中的变量和变量类型是什么?的使用技巧和注意事项,需要的朋友参考一下 变量为我们提供了程序可以操纵的命名存储。C ++中的每个变量都有一个特定的类型,该类型确定变量的内存大小和布局。可以存储在该内存中的值的范围;以及可以应用于该变量的一组操作。一个非常简单的变量示例是- 在这里,我们有一个变量my_val,类型为int(integer)
问题内容: 这听起来确实像是一个简单的问题,但我没有运气。什么是中 手段? 问题答案: 运算符返回该对象的数字表示。因此,在您的特定情况下,它似乎是在判断是否为非零数字。