【问题标题】:Outer Variable Access in PHP ClassPHP 类中的外部变量访问
【发布时间】:2010-11-05 05:52:39
【问题描述】:

考虑以下情况

文件:./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 是可以接受的还是会给出错误的结果。

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

【问题讨论】:

    标签: php oop class global-variables data-access


    【解决方案1】:

    使用global keyword

    在您分配值的文件中。

    global $tablePages;
    $tablePages = 'orweb_pages';
    

    在另一个文件中:

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

    此外,所有全局变量都可以在 $GLOBALS 数组(它本身是一个超全局变量)中使用,因此您可以在任何地方访问全局变量,而无需使用 global 关键字,方法如下:

    $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);
    

    【讨论】:

    • 非常感谢!疑问:我将不得不手动声明 $GLOBALS['tablePages'] = 'tablePages';对吗?
    • 我喜欢传递给构造函数的最后一个技巧。重要的。竖起大拇指。
    【解决方案2】:

    使用全局(不推荐)、常量或单例配置类。

    简单地包括

    $tablePages = 'orweb_pages';
    

    将为您的变量提供本地范围,使其在其他类中不可见。如果使用常量:

    define('TABLE_PAGES', 'orweb_pages');
    

    无论范围如何,TABLE_PAGES 都可用于整个应用程序的读取访问。

    常量优于全局变量的优点是您不必担心它会在应用程序的其他区域被覆盖。

    【讨论】:

    • 常量必须是全大写还是只是一种避免任何常见标识符冲突的编程实践?
    • 在类外定义的函数的作用域问题也成立吗?
    • 不,在类外声明的函数在全局命名空间中
    【解决方案3】:
    <?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"; 
    ?>
    

    【讨论】:

    • 一般来说,如果答案包含对代码用途的解释,则会更有用。
    猜你喜欢
    • 2018-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多