循环PHP对象

时间:2012-08-29 13:15:04

标签: php mysql oop

假设我们有一个PHP类Page,它在CMS中生成PHP Page个对象。在类中,我们有一个名为GetPages()的函数,它为系统中的所有页面返回Page个对象的数组。

如果我们想在表格中输出这些内容,我们可以这样做:

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类中,但我对有效运行两次的循环有一些担忧。任何人都可以建议一个更好的方法吗?

3 个答案:

答案 0 :(得分:2)

当您假设时,您从 u 中选择屁股(好吧,不是我,而是你得到它)

使用 Profile

XDebug 您的应用,分析结果,然后回过头来解决速度方面的具体问题。

请记住,premature optimization is the root of all evil

答案 1 :(得分:0)

您可以在创建阵列时创建输出字符串,但如果没有无限多页,则在页面中循环两次不会太慢。

我认为你应该有一个页面的字符串成员,它将包含你的结果,你应该有一个函数可以生成包装你的值的html。但我认为这不是主要问题,您应该通过创建索引来优化数据库,以便您的选择更快。

答案 2 :(得分:0)

将public var放在类的顶部,然后触发函数将该pages数组放在该var中,然后返回:

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();