如何将匿名功能插入扩展类?

时间:2016-07-24 13:06:16

标签: php oop

我有一个看起来像这样的基本控制器:

<?php
namespace framework;

class BaseController
{
    public $model;
    public $view;

    function __construct()
    {
        $this->model = new ModelFactory();
        $this->view = new View($this->model->data);
    }
}

永远不会直接调用此控制器,只能通过extends

调用
<?php
namespace framework\controllers;

use framework\BaseController,
    framework\Router;

class IndexController extends BaseController
{
}

我想做的事情,并希望这是有意义的,是在$this->model$this->view之间插入数据或额外的功能到基本控制器中,以便它能够在<?php namespace framework; class BaseController { public $model; public $view; function __construct() { $this->model = new ModelFactory(); // get user data $this->model->data['user_roles'] = array(); if ($user = $this->isLoggedIn()) { $this->model->data['user_roles'] = $user->roles; } $this->view = new View($this->model->data); } // check if a user is logged in and return a user object or false public function isLoggedIn() {} } // anonymous function in my bootstrap or global configuration file $user_roles = function () {}; <?php namespace framework; class BaseController { public $model; public $view; function __construct($name, $value) // not sure how these are passed in { $this->model = new ModelFactory(); // get extra data $this->model->data[$name] = $value($this->model); $this->view = new View($this->model->data); } } 之间插入数据或额外的功能。是匿名的或解耦的,而不是硬编码的。作为示例,应用程序可能需要也可能不需要用户数据。以下是我可以硬编码的方法,尽管这正是我试图避免的:

{{1}}

以下是我的大脑认为我想要完成的伪代码:

{{1}}

不确定我是否需要特定的模式,或者我是否朝着正确的方向前进。我怎样才能在这些方面取得成就?我接受任何推荐的替代方法。

1 个答案:

答案 0 :(得分:0)

您正在寻找的是PHP traits

特征是一种提取/隔离行为的方法,然后您可以注入&#34;在任何一个班级。

宣布特质时:

trait ControllerQueryable
{
  public function magicQuery()
  { // $this is the class that's using this trait.
    $this->orm->fetch(str_replace(get_class($this), 'Controller', ''), $this->params['id']);
  }
}

它适用于任何课程use

class BlogController extends BaseController
{
  use ControllerQueryable;

  public function showAction()
  {
    $model = $this->magicQuery();
    // yada yada yada
  }
}

extends相反,您可以use尽可能多的特征。