0

我刚刚遇到一段代码,它可以通过使其成为全局变量来访问变量,并开始思考它是否与其他语言方法/行为不同

<?php
   $a1 = "WILLIAM";
   $a2 = "henry";
   $a3 = "gatES";
   echo $a1 . " " . $a2 . " " . $a3 . "<br />";
   fix_names();
   echo $a1 . " " . $a2 . " " . $a3;
   function fix_names()
   {
      global $a1; $a1 = ucfirst(strtolower($a1));
      global $a2; $a2 = ucfirst(strtolower($a2));
      global $a3; $a3 = ucfirst(strtolower($a3)); 
   }
 ?>

代码访问在函数外部定义的变量,并使它们在函数内部成为全局变量。这在其他语言中是不可能的。例如,我们在 C 的全局空间中编写变量并使其成为全局变量,因此我们可以在函数内部访问它们。因此,我们首先将它们设为全局,然后在任何地方访问它们。在上面的代码中,我们首先在函数内部访问它们(我也不明白当它们没有作为参数传递时我们如何访问函数内部的 $a1、$a2、$a3),然后将它们设为全局。这是因为 PHP 处理器的任何不同行为。

此外,我不明白我们如何使变量在其声明之外的其他地方成为全局变量。

抱歉,这可能不是一个确切地询问代码在哪里中断的问题,但我相信理解为什么代码以特定方式编写以及为什么它以特定方式运行也很重要。

(希望)用清晰的语言表达

我想知道:在函数内部,当我们创建一个与外部范围中已经存在的变量同名的全局变量时,它实际上是全局化外部范围中的变量而不是创建一个新的全局变量(具有空值)。是这样吗?如果是,那与其他语言没有什么不同吗?那么,这种不同的行为背后有什么原因吗?

4

4 回答 4

1

在 php 中,函数有自己的作用域,因此如果您在函数之外的其他地方声明变量,它将在函数内部不可见。要在函数中使用它们,您需要将其声明为全局的。通常,我使用注册表模式来不污染全局范围并存储我稍后将使用的所有全局对象。

于 2012-11-25T08:26:50.180 回答
0

考虑使用会话。您可以像这样在文件 file1.php 中定义变量:

session_start();    
$_SESSION['a'] = 'William';

然后您可以访问文件 file2.php 中的任何会话变量,如下所示:

回声 $_SESSION['a'];

于 2012-11-25T08:23:00.827 回答
0

根据手册 - h​​ttp: //php.net/manual/en/language.variables.scope.php

变量的范围是定义它的上下文。大多数情况下,所有 PHP 变量都只有一个作用域。这个单一范围也涵盖了包含和必需的文件。
...
但是,在用户定义的函数中,引入了本地函数范围。默认情况下,函数内部使用的任何变量都仅限于本地函数范围。
...
您可能会注意到,这与 C 语言有点不同,因为 C 中的全局变量自动可用于函数,除非被局部定义特别覆盖。这可能会导致一些问题,因为人们可能会无意中更改全局变量。在 PHP 中,如果要在函数中使用全局变量,则必须在函数中声明它们为全局变量。

这使您可以$var在函数中使用相同的名称,而无需重新分配值-

$var = 'string';

function test(){
$var = 'new string';
return $var;
}
echo $var;  // echo's - string
test();     // echo's - new string
于 2012-11-25T08:23:55.740 回答
0

请找到一篇关于 php 中的全局变量的好文章 - 它将告诉您 PHP 语言中存在的各种全局变量以及如何使用和访问这些变量及其用途。

参考:https ://www.w3elearners.com/php/global-variables/

于 2018-02-17T08:39:07.773 回答