2011-04-13 16 views
3

我是PHP新手,花了一些時間尋找類似的問題,但似乎沒有人爲我回答。PHP - 可能調用存儲在數組中的對象的成員函數?

我有一個對象數組(我創建一個名爲StatusMessage的類),我想訪問數組中的每個對象的成員函數。我能夠使用foreach循環做到這一點,但我只需要訪問前10個對象(它們被排序),所以我試圖使用for循環。當我進行成員函數調用時,我得到一個關於無法在非對象上調用成員函數的致命錯誤。是否需要轉換$ statObjs中的StatusMessage對象?

有什麼建議嗎?

function collectStatuses($statusesAPI){ 

    $statusObjects = Array(); 
    foreach($statusesAPI as $status) 
    { 
     //StatusMessage is a class I created 
    array_push($statusObjects, new StatusMessage($status));    
    }   
    return $statusObjects; 
} 

//$statutuses[data] was populated further up 
$statObjs = collectStatuses($statuses[data]); 

//This loop works, but prints all StatusMessage objects in $statObjs 
foreach ($statObjs as $value) { 
    //getInteractions() and getMessages() are both member functions of the StatusMessage class I created. 
    echo '[' . $value->getInteractions() . '] ' . $value->getMessage(); 
} 

//This loop doesn't work. Throws the error mentioned above 
for ($i = 0; $i < 10; $i++) { 

    echo '[' . $statObjs[$i]->getInteractions() . '] ' . $statObjs[$i]->getMessage(); 
} 
+0

感謝您指出缺少的$ s。我試圖清理這個帖子的代碼,並做了它。但是,在實際的代碼中,沒有缺失的美元符號。在嘗試調用成員函數時,我收到的唯一錯誤是在for循環中。 – brsivart 2011-04-13 22:43:11

+0

然後它可能是@Chris所說的,並且你的數組中只有不到10個對象。執行'print_r($ statObjs)'或'echo count($ statObjs)'並檢查它。 – 2011-04-13 22:47:41

+0

我有這個確切的問題。你有沒有發現它?每個人的回答似乎都表明你的對象數組中可能沒有10個項目,但我不認爲就是這樣。我有一個只有一個對象的數組,我不能使用$ arr [0]或current($ arr)訪問它的成員函數 - 只有當我使用foreach時。 – jessica 2011-07-02 23:31:33

回答

0

這是實際的代碼嗎?有幾個錯誤。

最後一個循環中的三個'i'變量缺少美元符號。

$i<10 
$statObjs[$i]-> 
$statObjs[$i]-> 

你增加附加$ J,當你想$ I($ I ++)增加

而且,如果沒有10條狀態消息,您可能要到$指望我<分鐘(10 ,$ statObjs.length)

希望這有助於

克里斯

+0

關於對象數量的好處。但是,'$ statObjs.length'是JavaScript,而不是PHP。你必須做'count($ statObjs)'。我沒有看到'$ j',我想你誤解了這個。 – 2011-04-13 22:50:14

+0

我認爲他編輯的代碼,因爲美元符號現在,並且$ j已被切換到$ i。 – 2011-04-14 01:10:35

+0

不,我之前沒有看到'$ j'。但是,他補充了美元符號。 – 2011-04-14 01:11:29

1

有時是值得寫一個簡單的測試,保存到一個單獨的文件,然後運行腳本日從命令行粗略瀏覽PHP解釋器。在調試複雜的代碼時,很容易導致錯誤的樹形結構。如果你感覺雄心勃勃,你可以進一步探索,並探索使用PHPUnit編寫單元測試。

<?php 

$statuses = array(
    'test1', 
    'test2', 
    'test3', 
    'test4', 
    'test5', 
    'test6', 
    'test7', 
    'test8', 
    'test9', 
    'test10', 
    'test11' 
); 


class StatusMessage { 
    private $status; 
    function __construct($status) { 
     $this->status = $status; 
    } 

    function getInteractions() { 
     return $this->status . " interactions"; 
    } 

    function getMessage() { 
     return $this->status . " messages"; 
    } 

} 

function collectStatuses($statusesAPI){ 

    $statusObjects = Array(); 
    foreach($statusesAPI as $status) 
    { 
     //StatusMessage is a class I created 
    array_push($statusObjects, new StatusMessage($status));    
    }   
    return $statusObjects; 
} 

//$statutuses[data] was populated further up 
$statObjs = collectStatuses($statuses); 

//This loop works, but prints all StatusMessage objects in $statObjs 
foreach ($statObjs as $value) { 
    //getInteractions() and getMessages() are both member functions of the StatusMessage class I created. 
    echo '[' . $value->getInteractions() . '] ' . $value->getMessage() . "\n"; 
} 

//This loop doesn't work. Throws the error mentioned above 
for ($i = 0; $i < 10; $i++) { 
    echo '[' . $statObjs[$i]->getInteractions() . '] ' . $statObjs[$i]->getMessage() . "\n"; 
} 
?> 
0

我還建議只是想,循環

$statusObject = $statObjs[$i]; 
print_r($statusObject); 

,然後或許運行的內,看看是否對象實際上就在那裏。有時候我覺得php不會將對象引用當作第一類對象,直接從數組中引用它們,這與您習慣使用的java或其他語言不同)。

這也讓你的實驗更科學一點,因爲你直接引用一個$變量而沒有$ variable ['ArrayFluff']的末尾。

for ($i = 0; $i < 10; $i++) { 
    $statusObject = $statObjs[$i]; 
    echo '[' . $statusObject->getInteractions() . '] ' . $statusObject->getMessage(); 
//I'm fairly confident this will work =] 
} 
-1

既然您已經納入了我在我以前的帖子中提出的建議,那麼現在的代碼已經適合我了。你使用PHP 5或更高版本?

0

你說的問題似乎表明數組並沒有一直設置到10.你還得到未定義的關鍵通知(要檢查error_reporting(E_ALL))。

如果是這樣的問題,你可以使用array_slice()來獲得子陣列,您需要:

foreach (array_slice($statObjs, 0, 10) as $obj) { 
    echo "[{$obj->getInteractions()}] {$obj->getMessage()}"; 
} 

即使$statObjs具有小於10周的indeces,array_slice將返回它。否則,它只返回前10個。

相關問題