栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

参考:什么是变量作用域?哪些变量可从何处访问?什么是“未定义的变量”错误?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

参考:什么是变量作用域?哪些变量可从何处访问?什么是“未定义的变量”错误?

什么是“可变范围”?

变量具有有限的“作用域”或“可从其访问的位置”。仅仅因为你写

$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;  // worksecho $baz;  // doesn't work

范围和包含的文件

文件边界 不能分开 范围:

a.php

<?php$foo = 'bar';

b.php

<?phpinclude 'a.php';echo $foo;  // works!

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

c.php

<?phpfunction 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?!?!!

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

您应该尽可能避免以任何方式使用全局范围;最肯定的是,您不应该将变量从全局范围“拉”到局部范围。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/373947.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号