假设我们有一个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
类中,但我对有效运行两次的循环有一些担忧。任何人都可以建议一个更好的方法吗?
答案 0 :(得分:2)
答案 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();