2012-09-06 77 views
1

我有一個對象需要訪問我的統計信息中先前聲明的數組。我當然可以在對象內部創建整個數組,但是由於多個對象使用完全相同的數組,因此每次創建新對象時都沒有理由通過調用數據庫來創建相同的數組來阻塞內存或時間目的。試圖訪問外部數組的PHP對象

所以,我明白,對象不能訪問全局變量,但是有沒有辦法從對象內部訪問外部數組?

示例代碼:

global $stats = array(); 
     $stats[1]['value']= 10; 
     $stats[1]['value1'] =2; 
     $stats[2]['value']= 12; 
     $stats[2]['value1'] =1; 

class Obj() { 

    private $valueA; 
    private $valueB; 

    function __construct($user) { 
    //access Database lets call $SQL; 
    $valueA = SQL->value; 

    } 

    function showA() { 
    return ($valueA * $stats[1]['value1']) + $stats[1]['value']; 
    } 

} 
+0

你是否可以將數組作爲參數傳遞給像對象中的'setArray()'方法? – David

+0

你的問題,促使我明白,我寫錯了問題,我編輯了這個問題..在這一點上,理解了一個可能的解決方案。 在本質上,我不想將數組值存儲在對象中,我只希望知道對象+數組的結果。 因此,爲什麼不將函數'showA()'更改爲showA $ stats),所以對象返回值,WITH在執行時計算的數組值,而不是將aray存儲在對象中。 感謝橡膠鴨子! – BaneStar007

回答

0

感謝Mike,謝赫和克里斯蒂安,

我不能在所有的信念給勾到你的答案,因爲你的話沒有幫助我瞭解的答案,把「全球$統計信息;」進入課堂會導致我在回覆中指出的錯誤。但是當我從網站獲得許可時,我會'提高'你的分數。

對於任何尋找答案的人,提醒一句,關鍵是不要將整個數組存儲在類中,這會造成巨大的內存浪費。關鍵是要獲得對班級以外存在的變量的訪問。

雖然通過將全局$ stats包含在類的函數中來添加對全局$ stats的訪問權限,但確實會產生所需的結果,但仍需要將數據存儲在類中,這又是違背這一點的。對不起,我從一開始就不清楚這一點。

相反:

示例代碼:

function showA(&$stats) { 
    return ($valueA * $stats[1]['value1']) + $stats[1]['value']; 
} 

}

這一點,如果我理解正確的話,將使用指針$統計變量,只返回$的範圍之內valueA在使用stats數組修改之後。不是將整個數組複製到另一個內存位置,也不是該類。

2

是如何改變你的類是這樣的:

class Obj() { 

    private $valueA; 
    private $valueB; 
    private $stats; 

    function __construct($user, $stats) { 
    $this->stats = $stats; 
    //access Database lets call $SQL; 
    $valueA = SQL->value * $this->stats[1]['value1'] + $this->stats[1]['value']; 
    $valueB = SQL->value * $this->stats[2]['value1'] + $this->stats[2]['value']; 
    } 

    function showA() { 
    return $valueA; 
    } 

} 

你的不僅僅是傳遞$stats對象在實例化。或者如果你不想在構造函數中使用它,只需製作一個setStats($stats)方法即可。

+0

無論哪種方式,整個數組都被存儲在對象中。但您的帖子幫我拿的下一個想法來處理.. – BaneStar007

2

我會告訴你三種方法來做到這一點:

  1. 陣列傳遞到類的構造函數。例如:$myObject = new Obj($stats);
  2. 作出這樣的服務了$stats數組類:$stats = new Stats(); $statsArray = $stats->getStats();
  3. 在你的類本身使用術語global內的公共方法的(未建立)來獲取變量:3:

    function() somePublicMethod() { 
        global $stats; 
        $valueA = SQL->value * $stats[1]['value1'] + $stats[1]['value']; 
        $valueB = SQL->value * $stats[2]['value1'] + $stats[2]['value']; 
    } 
    
+1

3.你不能把一個全球性的類,你得到這個錯誤: 解析錯誤:語法錯誤,意想不到的T_GLOBAL,期待T_FUNCTION 但作爲注意到了,你可以把它放在功能類 – BaneStar007

+1

是的,這是正確的,我的壞。我只在一個類的方法中使用全局方法:從引導程序或外部配置文件中獲取'$ config'變量 – Kristian

0

您可以從一個類中訪問的變量,即

$stats[1]['value']= 10; 
$stats[1]['value1'] =2; 
$stats[2]['value']= 12; 
$stats[2]['value1'] =1; 

class Obj { 
    var $myStats; 
    function __construct() { 
     global $stats; 
     $this->myStats= $stats; 
     print_r($this->myStats); 
    } 
} 

$obj=new Obj; // Array ([1] => Array ([value] => 10 [value1] => 2) [2] => Array ([value] => 12 [value1] => 1)) 

DEMO

+0

ahh,您的意思是您可以從FUNCTION中訪問全局變量,但是當我編寫全局變量在課堂上,它給了我錯誤 解析錯誤:語法錯誤,意外的T_GLOBAL,期待T_FUNCTION – BaneStar007

+0

你看到[demo](http://codepad.viper-7.com/7hx203)? –

+0

啊,我現在做,但沒有加載。超時錯誤。 (只用一個不同顏色的單詞是不明顯的) – BaneStar007