0

所以我创建一个 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 类也由主题本身扩展。因此,当调用活动主题时,会启动其类并调用其函数,然后调用各种(切碎的)html 部分来制作页面。

所以最初,themeFunctions 类没有被扩展,相反,它过去只是调用主题 index.php,widjets 是这样启动的:

*主题索引页面

 $this->widgetOutput('sidebarPosition');

*主cms索引页面

 $tmpl->setWidget('sidebarPosition','calculator');

但是在扩展了themeFunctions 类之后,上面的就不起作用了。任何帮助表示赞赏。

这只是我学习 OOP,所以请原谅代码中的错误,如果需要,请指出正确的方向。

4

1 回答 1

1

您的类ThemeFunctions是类层次结构的另一个分支。你有:

CmsBase
|
|--> ThemeFunctions
|
|--> CmsWidget
     |
     |--> CalculatorWidget

要继承ThemeFunctions功能,您需要ThemeFunctions在 class中扩展CmsWidget。所以你的结构如下:

CmsBase
|
|--> ThemeFunctions
     |
     |--> CmsWidget
          |
          |--> CalculatorWidget

在此结构中,您可以使用在ThemeFunctions.

如果它破坏了您关于类层次结构的计划,您可以查看 Traits。 http://php.net/manual/en/language.oop5.traits.php

于 2013-10-28T20:15:38.500 回答