首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >参考:什么是变量作用域,哪些变量可以从哪里访问,什么是“未定义的变量”错误?

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

Stack Overflow用户
提问于 2013-06-06 18:20:36
回答 2查看 53.8K关注 0票数 172

这是一个在

中处理变量作用域的参考问题。请将符合此模式的许多问题中的任何一个作为此模式的副本。

PHP中的“变量作用域”是什么?一个.php文件中的变量可以在另一个文件中访问吗?为什么有时我会得到“未定义的变量”错误?

EN

回答 2

Stack Overflow用户

发布于 2017-02-17 05:06:09

尽管定义在函数作用域内的变量不能从外部访问,但这并不意味着在该函数完成后就不能使用它们的值。PHP有一个众所周知的static关键字,它在面向对象的PHP中被广泛用于定义静态方法和属性,但是应该记住,static也可以在函数中用来定义静态变量。

什么是‘静态变量’?

静态变量与函数作用域中定义的普通变量的不同之处在于,当程序执行离开此作用域时,静态变量不会散开值。让我们考虑以下使用静态变量的示例:

function countSheep($num) {
 static $counter = 0;
 $counter += $num;
 echo "$counter sheep jumped over fence";
}

countSheep(1);
countSheep(2);
countSheep(3);

结果:

1 sheep jumped over fence
3 sheep jumped over fence
6 sheep jumped over fence

如果我们定义了不带static$counter,那么每次回显的值将与传递给函数的$num参数相同。使用static可以构建这个简单的计数器,而不需要额外的解决方法。

静态变量用例

  1. 用于在后续的函数调用之间存储值。
  2. 用于在无法(或没有目的)将值作为参数传递时在递归调用之间存储值。
  3. 用于缓存值,这通常更好地检索一次。例如,读取服务器上的不可变文件的结果。

技巧

静态变量仅存在于局部函数范围中。不能在定义它的函数之外访问它。因此,您可以确定它将保持其值不变,直到下一次调用该函数。

静态变量只能定义为标量或标量表达式(从PHP 5.6开始)。将其他值赋给它不可避免地会导致失败,至少在撰写本文的时候是这样。不过,您可以在代码的下一行执行此操作:

function countSheep($num) {
  static $counter = 0;
  $counter += sqrt($num);//imagine we need to take root of our sheep each time
  echo "$counter sheep jumped over fence";
}

结果:

2 sheep jumped over fence
5 sheep jumped over fence
9 sheep jumped over fence

静态函数在同一类的对象的方法之间是某种“共享”的。通过查看以下示例,很容易理解:

class SomeClass {
  public function foo() {
    static $x = 0;
    echo ++$x;
  }
}

$object1 = new SomeClass;
$object2 = new SomeClass;

$object1->foo(); // 1
$object2->foo(); // 2 oops, $object2 uses the same static $x as $object1
$object1->foo(); // 3 now $object1 increments $x
$object2->foo(); // 4 and now his twin brother

这只适用于同一类的对象。如果对象来自不同的类(甚至相互扩展),则静态变量的行为将如预期的那样。

是静态变量,这是在函数调用之间保持值的唯一方法--

在函数调用之间保持值的另一种方法是使用闭包。闭包是在PHP 5.3中引入的。换句话说,它们允许您将对某个函数范围内的某些变量集的访问限制为另一个匿名函数,而这将是访问这些变量的唯一方法。在闭包变量中可以模仿(或多或少成功地) OOP概念,比如结构化编程中的“类常量”(如果它们是通过值传递的闭包)或“私有属性”(如果通过引用传递)。

后者实际上允许使用闭包而不是静态变量。使用什么总是由开发人员决定,但应该提到的是,静态变量在处理递归时绝对有用,值得开发人员注意。

票数 10
EN

Stack Overflow用户

发布于 2019-05-13 22:18:16

我不会发布这个问题的完整答案,因为现有的和PHP manual已经很好地解释了大部分问题。

但是遗漏的一个主题是superglobals,包括常用的$_POST$_GET$_SESSION等。这些变量是在任何范围内始终可用的数组,没有global声明。

例如,此函数将打印运行PHP脚本的用户名。该变量对函数可用,没有任何问题。

<?php
function test() {
    echo $_ENV["user"];
}

“全局变量不好”的一般规则在PHP中通常被修改为“全局变量不好,但超全局变量还可以”,只要没有滥用它们。(所有这些变量都是可写的,所以如果你真的很糟糕,可以用它们来避免依赖注入。)

不能保证这些变量一定存在;管理员可以使用php.ini中的variables_order directive禁用部分或全部变量,但这并不常见。

一份当前的超全球化列表:

  • $GLOBALS -当前script
  • $_SERVER中的所有全局变量-服务器上的信息和在environment
  • $_GET的查询字符串中传递的执行URL值。无论使用哪种HTTP方法作为HTTP POST请求中传递的request
  • $_POST值,使用PHP
  • $_REQUEST内部存储的当前request
  • $_SESSION会话变量(通常是$_GET$_POST的组合,但有时也是$_COOKIES )传递HTTP POST请求中传递的multipart/form-data MIME type
  • $_COOKIE文件。内容由php.ini.
  • $_ENV中的request_order directive确定-即当前script

的环境变量

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16959576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档