Php 中的“变量作用域”是什么? 是一个变量。 可以访问另一个 php 文件? 为什么有时会出现“未定义变量”错误?
2条回答 默认 最新
- weixin_38166163 2019-07-24 15:04关注
什么是“变量范围” ?
变量有一个有限的“作用域” ,或者“能访问地方”。 仅仅因为你写了$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?!?!!
没有迹象表明这个功能有任何副作用,但它确实有。当一些函数不断修改并需要某些全局状态时,这很容易变成一团乱麻。您希望函数是无状态的,无论您调用它们的次数多少只对它们的输入执行操作,并返回定义的输出。
您应该尽可能地避免使用全局作用域; 当然,您不应该将变量从全局作用域“拉”到局部作用域中。解决 无用评论 打赏 举报