我以前从未使用过多态性。当这个问题出现时我才刚刚听说过。
我有一个有2个权限的后端。管理员/普通用户。根据权限,我想在表单上显示不同的导航,更少或更多的选项等。但我不想为每个权限创建一个表单,而是禁用我不需要的元素等。
我该怎么做?
目前,我正在使用类似的东西:(这不是真正的多态性)
<?php
class My_Resources_ResourceLoader extends Zend_Application_Resource_ResourceAbstract {
public $templateForm = null;
public $customerForm = null;
function init() {
$permission = 'admind';
if($permission == 'admin') {
$this->templateForm = new Application_Form_newTemplate;
} else {
$form = new Application_Form_newTemplate;
$form->removeElement('newTemplate_customer');
$this->templateForm = $form;
}
return $this;
}
}
在我的控制器中,例如
<?php
$bootstrap = $this->getInvokeArg('bootstrap');
$xx = $bootstrap->getResource('ResourceLoader');
$this->view->test = $xx->templateForm;
角色永远不会改变。这可能没问题,但不是最好的解决方案。什么是更好的方法呢?
答案 0 :(得分:1)
我已经抛弃了上面的方法,现在使用这样的真正多态:
应用程序/模型中的获得了如下界面:
和2个类一样:
<?php
class Application_Model_TemplateUser implements Application_Model_TemplateInterface {
private $table = null;
private $row = null;
private $id = null;
private $formValues = null;
function __construct() {}
public function exist() {}
public function save() {}
public function getCustomerId($name) {}
public function update() {}
public function getForm() {
$form = new Application_Form_newTemplate;
$form->removeElement('newTemplate_customer');
return $form;
}
}
和
<?php
class Application_Model_TemplateAdmin implements Application_Model_TemplateInterface {
private $table = null;
private $row = null;
private $id = null;
private $formValues = null;
function __construct() {}
public function exist() {}
public function save() {}
public function getCustomerId($name) {}
public function update() {}
public function getForm() {
return new Application_Form_NewTemplate();
}
}
在我的控制器中我做:
<?php
$permission = 'User'; //TODO: Get from Session
$class = 'Application_Model_Template' . $permission;
$xx = new $class;
$form = $xx->getForm();
$this->view->test = $form;
这只是一个例子。但我认为我真的是在一个更好的方式。也许我将使用抽象类,因为我使用的是Zend_Db-Table_Row,它对于更新行总是相同的,所以使用抽象类而不是接口会更有意义。
关于PHP中多态性的好文章:http://net.tutsplus.com/tutorials/php/understanding-and-applying-polymorphism-in-php/