Hinweis: Dies ist eine Referenzfrage, die sich mit dem Variablenbereich in PHP befasst. Bitte schließen Sie alle Fragen, die diesem Muster entsprechen, als Duplikate dieser Frage.
Was ist „Variablenbereich“ in PHP? Kann auf Variablen in einer .php-Datei in einer anderen .php-Datei zugegriffen werden? Warum erhalte ich manchmalFehler „undefinierte Variable“?
尽管无法从外部访问在函数作用域内定义的变量,但这并不意味着您不能在该函数完成后使用它们的值。 PHP 有一个众所周知的
static
关键字,在面向对象的 PHP 中广泛用于定义静态方法和属性,但应该记住static
也可以在函数内部使用定义静态变量。什么是“静态变量”?
静态变量与函数作用域中定义的普通变量不同,当程序执行离开该作用域时,静态变量不会丢失值。让我们考虑以下使用静态变量的示例:
结果:
如果我们定义的
$counter
没有static
那么每次回显的值将与传递给函数的$num
参数相同。使用static
可以构建这个简单的计数器,无需额外的解决方法。静态变量用例
技巧
静态变量仅存在于局部函数作用域中。它不可能是 在定义它的函数之外访问。所以你可以 确保它将保持其值不变,直到下次调用 该功能。
静态变量只能定义为标量或标量 表达式(自 PHP 5.6 起)。不可避免地为其分配其他值 至少在撰写本文时会导致失败。 不过,您可以在代码的下一行执行此操作:
结果:
静态函数在对象的方法之间有点“共享” 同班。看下面的例子就很容易理解了:
这只适用于同一类的对象。如果对象来自不同的类(甚至相互扩展),静态变量的行为将符合预期。
静态变量是在函数调用之间保留值的唯一方法吗?
在函数调用之间保留值的另一种方法是使用闭包。 PHP 5.3 中引入了闭包。简而言之,它们允许您将对函数作用域内的某些变量集的访问限制为另一个匿名函数,这将是访问它们的唯一方法。位于闭包变量中可能会模仿(或多或少成功)OOP 概念,例如结构化编程中的“类常量”(如果它们在闭包中按值传递)或“私有属性”(如果通过引用传递)。
后者实际上允许使用闭包而不是静态变量。使用什么始终由开发人员决定,但应该提到的是,静态变量在使用递归时绝对有用,值得开发人员注意。
什么是“变量范围”?
变量的“范围”或“可访问它们的位置”是有限的。仅仅因为您在应用程序中的某个某处编写了
$foo = 'bar';
一次,并不意味着您可以从引用$foo
>应用程序内的其他地方。变量$foo
有一定的作用域,在该作用域内它是有效的,并且只有同一作用域内的代码才能访问该变量。PHP 中如何定义范围?
非常简单:PHP 有函数作用域。这是 PHP 中存在的唯一一种范围分隔符。函数内部的变量仅在该函数内部可用。函数外部的变量可以在函数外部的任何地方使用,但不能在任何函数内部使用。这意味着 PHP 中有一个特殊的作用域:全局作用域。在任何函数外部声明的任何变量都在此全局范围内。
示例: