1

CMS でPagePHP オブジェクトを生成するPHP クラスがあるとします。Pageクラス内には、システム内のすべてのページのオブジェクトGetPages()の配列を返すという関数があります。Page

これらを表に出力したい場合は、次のようにすることができます。

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

これは非常にクリーンなソリューションですが、1 回だけ実行する必要があるのに、基本的に 2 つのループを実行しています。クライアントが委託したオーダーメイドの 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クラス内に含める必要がありますが、ループが効果的に 2 回実行されることに懸念があります。誰でもこれに対するより良いアプローチを提案できますか?

4

3 に答える 3

2

あなたが考えるとき、あなたはあなたとからお尻を作ります。(まあ、直接私ではありませんが、わかります)

XDebugを使用してアプリケーションをプロファイリングし、結果を分析してから、速度に関する具体的な問題を突き止めてください。

また、時期尚早の最適化は諸悪の根源であることを忘れないでください。

于 2012-08-29T13:49:17.867 に答える
0

配列の作成中に出力文字列を作成できますが、無限に多くのページがなければ、ページを 2 回ループしても遅くはありません。

結果を含むページの文字列メンバーが必要であり、値をラップするhtmlを生成する関数が必要だと思います。しかし、これは主な問題ではないと思います。インデックスを作成してデータベースを最適化し、選択が速くなるようにする必要があります。

于 2012-08-29T13:25:32.537 に答える
0

public var をクラスの先頭に配置し、関数をトリガーしてその 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 に答える