2012-11-25 107 views
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处理器的任何不同行为。

而且我不明白我们如何才能使全球的变量从它的声明别处了。

对不起,这可能不是问究竟在何处的代码被打破了问题,但我相信理解为什么代码写在一个特定的方式,以及为什么它在一个特定的行为方式也很重要。

把它(希望)在很大程度上被清除的话

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

+0

你知道什么时候使用'函数...里面global'?我在问,因为你说过,“在上面的代码中,我们首先在函数内部访问它们,然后使它们成为全局的。” – NazKazi

+0

总之告诉我你究竟想知道什么......?如何在函数内部使用全局变量......? – NazKazi

+0

@BlackCobra问题追加 – Mahesha999

回答

0

根据手册 - http://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 
+0

因此,当我们在外部范围中定义一个具有相同名称的变量全局变量时,那么该变量将变为全局变量而不是声明新的全局变量? – Mahesha999

+0

如果你在函数和值中声明了'global'' $ var ='string';函数test(){global $ var; $ var ='new string'; return $ var;}'它将保留全局值'echo $ var; // echo's string',直到你调用函数'echo test(); //每次在你回显$ var后,它都会回显'新字符串'而不是'字符串' – Sean

0

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

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

然后你就可以访问任何会话变量文件file2.php这样的:

回声$ _SESSION [“一”];

+0

你疯了吗???他仍然在同一个文件中...我不明白你为什么使用'$ _SESSION' ...?并从你得到'file1.php' ...? – NazKazi

1

PHP函数都有自己的范围,因此,如果您在其他地方声明变量的函数外它不会在里面看到。要在函数内部使用它们,你需要声明它是全局的。通常情况下,我使用Registry模式不会监视全局范围并存储我稍后将使用的所有全局对象。