2013-04-04 199 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

相關問題