2012-08-29 272 views
1

我們假設我們有一個PHP類Page,它在CMS中生成PHP Page對象。在課堂內部,我們有一個名爲GetPages()的函數,它爲系統中的所有頁面返回一個Page對象的數組。循環訪問PHP對象

如果我們要輸出這些在一個表中,我們可以這樣做:

foreach(Page::GetPages() as $page) 
{ 
    echo $page->title.'<br />'; 
} 

這是一個非常乾淨的解決方案,但我們主要進行兩個循環,當我們只需要運行一旦。在處理客戶委託的定製CMS時,我遇到了這個問題,他們現在希望我們對其進行檢修(僅僅是因爲速度)。

我在想,這可能是更好的從類中刪除GetPages()功能,做這樣的事情的管理界面上:

$pages = "SELECT `id` FROM `ig_pages`"; 
$result = Database::Singleton()->Query($pages); 
while($page = $result->fetch_object()) 
{ 
    $this_page = new Page($page->id); 
    echo $this_page->title.'<br />'; 
} 

顯然從一個角度架構的角度,功能確實應該包括在Page類中,但我對循環有效地運行兩次有一些擔憂。任何人都可以提出一個更好的方法嗎?

+6

如果我擔心速度 - 我的第一個停靠點是數據庫和一堆['EXPLAIN'](http://dev.mysql.com/doc/refman/5.0/en/explain.html ) - 在那裏做。 –

+0

我不認爲運行foreach迭代數組會花費你很多(根本)在速度方面。當檢測速度的應用程序,你的第一個重點應該是數據庫。 Foreach在計算上非常便宜。 – Andrew

+0

不要盲目追求,而是應用程序的配置文件來查看瓶頸是什麼。只是改變隨機的東西是錯誤的方法。 – PeeHaa

回答

0

您可以在創建陣列時創建輸出字符串,但如果您沒有無限多頁,則在頁面中循環兩次不會太慢。

我認爲你應該有一個你的頁面的字符串成員,其中將包含你的結果,你應該有一個函數,它會生成包裝你的值的HTML。但我認爲這不是主要問題,您應該通過創建索引來優化數據庫,以便您的選擇更快。

0

把一個公共變種在你的類的頂部,然後觸發功能放置在該變種的網頁數組返回然後才:

class myPagescreator(){ 

public var $pages = array(); 

function __construct(){ 

} 

function GetPages(){ 
    //here your query to get all pages info from database (PDO fetchALL or param::fetchCOLUMN return a nice array from your queries) 
    $this->pages = $DBqueryReturnInArray; 
    # 
    # here you should call and merge all the infos you need with a function call like $this->functionToGetPageBody($myPagesID); to merge to your array of pages ($this->page = array_merge($this->page,$thispageBody)) in a foreach or a while 

    return $this->pages; 
    } 
} 

//The on your class call from your CMS 
$pageMe = new Page(); 
//Activate the function in your class 
$pageMe->GetPages(); 

// getting the var of arrayOfpages in the class Page 
$imAnArrayOfPages = $pageMe->pages; 
// Or getting the return of the function that will return your var at the same... 
$imAnArrayOfPages = $pageMe->GetPages();