2009-06-23 448 views
3

考虑下列情形外生变量的访问

文件:含./include/functions/table-config.php :

. 
. 
$tablePages = 'orweb_pages'; 
. 
. 

文件:./include/classes/uri-resolve。 PHP 包含:

class URIResolve { 
. 
. 
$category = null ; 
. 
. 
function process_uri() { 
... 
    $this->category = $tablePages; 
... 
} 
. 
. 
}

文件:./settings.php含 :

. 
. 
require_once(ABSPATH.INC.FUNC.'/table-config.php'); 
require_once(ABSPATH.INC.CLASS.'/uri-resolve.php'); 
. 
. 
将这项工作。我的意思是访问process_uri()中的$ tablePages是可以接受的,还是会给出错误的结果。

如果可能发生错误,请提出更正或解决方法。

回答

3

使用一个全球性的(不推荐),常量或单配置类。

简单地包括

$tablePages = 'orweb_pages'; 

会给你的局部变量的范围,这样就不会被其他类中可见。如果使用常量:

define('TABLE_PAGES', 'orweb_pages'); 

TABLE_PAGES将可用于整个应用程序的读取访问,而不受范围限制。

一个常量在全局变量上的优点是你不必担心它在应用程序的其他区域被覆盖。

+0

做的常量必须是全部大写还是只是一种编程习惯,以避免任何常见的标识符冲突? – OrangeRind 2009-06-23 17:08:36

9

使用global keyword

在该文件中,你要指定的值。

global $tablePages; 
$tablePages = 'orweb_pages'; 

而在其他文件中:

class URIResolve { 
    var $category; 
    function process_uri() { 
    global $tablePages; 
    $this->category = $tablePages; 
    } 
} 

而且,所有的全局变量是$GLOBALS阵列中可用(这本身就是一个超全局变量),这样你就可以在任何地方访问全局变量,而无需使用全球关键字做这样的事情:

$my_value = $GLOBALS['tablePages']; 

这也有助于更难以无意中覆盖全球的价值。在前面的示例中,对$tablePages所做的任何更改都会更改全局变量。许多安全漏洞都是由全局的$user创建的,并用更强大的用户信息覆盖它。

另外,更安全的方法是提供在构造函数中的变量URIResolve:

class URIResolve { 
    var $category; 

    function __construct ($tablePages) { 
    $this->category= $tablePages; 
    } 

    function process_uri() { 
    // Now you can access table pages here as an variable instance 
    } 
} 

// This would then be used as: 
new URIResolve($tablePages); 
+0

非常感谢! 怀疑:我将不得不手动声明$ GLOBALS ['tablePages'] ='tablePages';对? – OrangeRind 2009-06-23 17:10:46

+0

我喜欢将最后一个技巧传递给构造函数。重要。竖起大拇指。 – andho 2012-02-29 05:10:49

0
<?php 
//Use variable php : $GLOBALS in __construct 
$x = "Example variable outer class"; 

class ExampleClass{ 
    public $variables; 
    function __construct() 
    { 
    $this->variables = $GLOBALS; //get all variables from $GLOBALS 
    } 
    // example get value var 
    public function UseVar(){ 
    echo $this->variables['x']; // return Example variable outer class 
    } 
    // example set value var 
    public function setVar(){ 
    $this->variables['x'] = 100; 
    } 
} 
echo $x // return Example variable outer class; 

$Example = new ExampleClass(); 
$Example->UseVar(); // return Example variable outer class 
$Example->setVar(); // $x = 100; 

// or use attr variables 
echo $Example->variables['x']; // 100 
$Example->variables['x'] = "Hiii"; 
?>