所以创建一个cms作为一种学习OOP的方式,并且有点卡住了。这是我的问题。 (下面粘贴的代码被剥离到极少)
我有一个名为ThemeFunctions的类,它具有以下代码来构成小部件功能:
require_once('cmsBase.php');
class ThemeFunctions extends CmsBase{
//All CMS template management related functions will be here.
var $templateName='default';
var $widgetPositions=array();
function show()
{
$this->themeOutput();
}
/*apps*/
function appOutput()
{
$appname=(isset($_REQUEST['app']))?$_REQUEST['app']:'default';
require_once('applications/'.$appname.'/'.$appname.'.php');
$application=ucfirst($appname).'Application';
$app=new $application();
$app->run();
}
/*widjets*/
function widgetOutput($position='default')
{
if(!empty($this->widgetPositions[$position]))
{
$widgets=$this->widgetPositions[$position];//gets all widgets in given position
foreach($widgets as $widgetObject)//display each widget
{
$widgetName=$widgetObject->name;
$widgetParameters=$widgetObject->parameters;
if(file_exists($file = 'widgets/'.$widgetName.'/'.$widgetName.'.php'))
{
require_once($file);
echo 'file loaded';
} else {echo 'file doesn\'t exist';}
$widgetclass=ucfirst($widgetName).'Widget';
$widget=new $widgetclass();
$widget->run($widgetName,$widgetParameters);
}
}
}
function setWidget($position,$widgetName,$params=array())
{
$widget=new StdClass;
$widget->name=$widgetName;
$widget->parameters=$params;
//if there is no widget in position then create a new array
if(empty($this->widgetPositions[$position]))
{
$this->widgetPositions[$position]=array($widget);
}
//if there is already a widget present in that position then just push new widget in array
else
{
array_push($this->widgetPositions[$position],$widget);
}
}
并且在索引文件中实例化的类如下:
require_once('libraries/core/themeFunctions.php');
$tmpl=new ThemeFunctions();
$tmpl->show();
widjet有自己的基类,名为CmsWidjet,它具有以下代码
class CmsWidget extends CmsBase{
var $widgetPath='';
var $widgetName='';
var $parameters=array();
function setWidgetPath($widgetName)
{
$this->widgetPath='widgets/'.$widgetName.'/';
$this->widgetName=$widgetName;
}
function getWidgetPath()
{
return $this->widgetPath;
}
function display()
{
echo 'this will be default output of widget if this function is not overrided by derived class';
}
function run($widgetName,$params)// this function will be called by template function class to display widget
{
$this->parameters=$params;
$this->setWidgetPath($widgetName);
$this->display();
}
}
和widjet本身的代码是:(即计算器widjet)
require_once('libraries/core/cmsWidget.php');
class CalculatorWidget extends CmsWidget{
function display()
{
//if use_scientifc parameter is set and its value is true then output scientific calculator
if(!empty($this->parameters['use_scientific']) and $this->parameters['use_scientific']==true)
{
require($this->getWidgetPath().'tmpl/scientific.php');
}
else
{
require($this->getWidgetPath().'tmpl/default.php');
}
}
}
现在棘手的部分是ThemeFunctions类也被主题本身扩展。因此,当调用活动主题时,它的类被启动并且其函数被调用,这反过来调用各种(choped)html部分来创建页面。
所以最初,themeFunctions类没有被扩展,相反,它只用于调用主题index.php,而widjets就像这样启动:
*主题索引页
$this->widgetOutput('sidebarPosition');
*主要cms索引页
$tmpl->setWidget('sidebarPosition','calculator');
但是在扩展themeFunctions类后,上面的方法不起作用。任何帮助表示赞赏。
这也只是我学习OOP,所以请原谅代码中的错误,如果有必要,请指出正确的方向。
答案 0 :(得分:1)
您的班级ThemeFunctions
是班级层次结构的另一个分支。
你有:
CmsBase
|
|--> ThemeFunctions
|
|--> CmsWidget
|
|--> CalculatorWidget
要继承ThemeFunctions
功能,您需要在课程ThemeFunctions
中扩展CmsWidget
。
所以你的结构如下:
CmsBase
|
|--> ThemeFunctions
|
|--> CmsWidget
|
|--> CalculatorWidget
在此结构中,您可以使用ThemeFunctions
中声明的函数。
如果它破坏了关于类层次结构的计划,您可以查看Traits。 http://php.net/manual/en/language.oop5.traits.php