在其他方法中使用__construct()中的变量

Maj*_*Afy 6 php oop constructor global-variables

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

这是我的代码:

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

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

}
Run Code Online (Sandbox Code Playgroud)

Ale*_*rov 10

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

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

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

请注意,强烈建议不要广泛使用全局变量,考虑重新设计类以使用带有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;
     }
}
Run Code Online (Sandbox Code Playgroud)

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

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;
     }

}
Run Code Online (Sandbox Code Playgroud)

您甚至可以使用来自全局变量的数据构造此对象,$c直到您从代码中删除它为止:

new testObject($c['name'], $c['family'])
Run Code Online (Sandbox Code Playgroud)

  • @MajAfy不,它不安全,因为它打破了封装并使你的类依赖于这些变量在全局范围内的某处定义和改变.这是不好的做法.如果类需要$ c和$ data,请使用依赖注入并将这些值存储为对象属性. (2认同)