1

假设我们有一个 PHP 类,它在 CMSPage中生成 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类中,但我对循环有效运行两次感到担忧。任何人都可以为此提出更好的方法吗?

4

3 回答 3

2

当你假设时,你把你搞得一团糟(好吧,不是我直接,但你明白了)

使用XDebug分析您的应用程序分析结果,然后返回有关速度的具体问题。

请记住,过早的优化是万恶之源

于 2012-08-29T13:49:17.867 回答
0

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

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

于 2012-08-29T13:25:32.537 回答
0

在您的类顶部放置一个公共 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();
于 2012-08-29T13:44:13.497 回答