【问题标题】:Use a variable from __construct() in other methods在其他方法中使用来自 __construct() 的变量
【发布时间】:2013-03-26 12:41:31
【问题描述】:

我在__construct() 中定义了一个新变量,我想在这个class 的另一个function 中使用它。 但是我的变量在另一个函数中是空的!

这是我的代码:

class testObject{
     function __construct() {
           global $c;
           $data = array("name"=>$c['name'],
                         "family"=>$c['family']);
     }

     function showInfo() {
           global $data;
           print_r($data);
     }

}

【问题讨论】:

标签: php oop constructor global-variables


【解决方案1】:

在构造函数中声明变量$data为全局变量:

 function __construct() {
       global $c;
       global $data;
       $data = array("name"=>$c['name'],
                     "family"=>$c['family']);
 }

然后,它也将在其他功能中可见。

请注意,强烈建议不要广泛使用全局变量,请考虑重新设计您的类以使用带有 getter+setter 的类变量。

更合适的方法是使用

class testObject
{
     private $data;

     function __construct(array $c) 
     {
         $this->data = array(
             "name"=>$c['name'],
             "family"=>$c['family']
         );
     }

     function showInfo() 
     {
         print_r($this->data);
     }

     // getter: if you need to access data from outside this class
     function getData() 
     {
         return $this->data;
     }
}

另外,请考虑将数据字段分成单独的类变量,如下所示。然后你就有了一个典型的、干净的数据类。

class testObject
{
     private $name;
     private $family;

     function __construct($name, $family) 
     {
         $this->name = $name;
         $this->family = $family;
     }

     function showInfo() 
     {
         print("name: " . $this->name . ", family: " . $this->family);
     }

     // getters
     function getName() 
     {
         return $this->name;
     }

     function getFamily() 
     {
         return $this->family;
     }

}

您甚至可以使用全局变量 $c 中的数据构造此对象,直到您将其从代码中排除:

new testObject($c['name'], $c['family'])

【讨论】:

  • @MajAfy 不,它不安全,因为它破坏了封装并使您的类依赖于这些变量,这些变量在全局范围内的某个地方被定义和更改。这是不好的做法。如果该类需要 $c 和 $data,请使用依赖注入并将这些值存储为对象属性。
  • @MajAfy - 你所说的“安全”到底是什么意思?使用全局变量只是一种不好的做法,如果可能应该避免。我刚刚从技术上解释了为什么其他类方法中的变量为空。
  • @MajAfy:我又添加了一项建议,您可以如何重新设计您的课程。
【解决方案2】:

你可以这样做。而不是将$data 声明为global 变量,而是根据您的使用在类中声明为publicprivateprotected 变量。然后在_construct里面设置数据。

在类中使用全局不是一个好方法。您可以使用类属性。

class testObject{
    public $data;

    function __construct() {
        global $c;
        $this->data = array("name"=>$c['name'],
                        "family"=>$c['family']);
    }

    function showInfo() {
        print_r($this->data);
    }

}

【讨论】:

  • 它之所以失败,是因为您需要责怪 OP 对 OOP 的“糟糕”了解,而不是帮助理解 ;)
  • 这正是我在我的应用程序中实现的。
猜你喜欢
  • 1970-01-01
  • 2016-05-09
  • 2021-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-31
  • 2011-02-17
相关资源
最近更新 更多