2013-04-04 200 views
1

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

这是我的代码:

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

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

} 
+0

实际上你看过吗:http://uk.php.net/manual/en/language.oop5.php? – 2013-04-04 12:32:43

+0

不是答案,而是相关的:http://stackoverflow.com/questions/11923272/use-global-variables-in-a-class/11923384#11923384 – PeeHaa 2013-04-04 12:32:46

+0

使用类属性而不是'global': http:// www.php.net/manual/en/language.oop5.properties.php使用'global'(几乎?)从来不是一个好的解决方案。 – str 2013-04-04 12:33:22

回答

3

声明变量$data全球的构造函数中:

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

然后,它会在其他功能可看见的。

请注意,广泛使用全局变量是极不鼓励的,请考虑重新设计您的类以使用类变量与getters + 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; 
    } 

} 

直到你从你的代码elimitate它,你甚至可以从你的全局变量$c构建具有数据这个对象:

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

谢谢你,它为我工作,它是安全的吗? – MajAfy 2013-04-04 12:36:38

+2

@MajAfy不,它不安全,因为它破坏了封装并使得你的类依赖于这些变量在全局范围内的某个地方被定义和修改。这是不好的做法。如果类需要$ c和$ data,请使用依赖注入并将这些值存储为对象属性。 – Gordon 2013-04-04 12:37:26

+0

@MajAfy - “安全”是什么意思?使用全局变量只是一个不好的做法,应该避免*如果可能的话*。我刚刚解释了为什么变量在其他类方法中是空的。 – 2013-04-04 12:41:03

2

你可以做到这样。而不是声明$dataglobal变量声明为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); 
    } 

} 
+0

为什么downvote?这是正确的方法吗? – Sabari 2013-04-04 12:40:30

+1

这样做是因为你需要责怪OP对OOP的“坏”认识,而不是帮助理解;) – Narek 2013-04-04 12:43:35

+0

所以这里有什么错误。我告诉他正确的方法 – Sabari 2013-04-04 12:48:03

相关问题