Jef*_*eff 5 php oop inheritance codeigniter
想知道这是否可能或PHP的限制,谷歌搜索似乎是这种情况,但也许我错过了一个聪明的解决方案.
希望这是有道理的.现在我有两个部分到我的网站,一个管理员和客户端.我已经能够将它分成两个从基础MY_Controller类继承的控制器(管理员和客户端),但我遇到的问题是实现我的身份验证控制器.
客户端/管理员登录之间有很多共享代码,现在我要么必须为扩展基础的每个管理员和客户端创建一个auth控制器(这意味着重复代码很多),或者只是扩展MY_Controller类和使用每个函数中的if/thens,然后变得有点混乱(并绕过管理员/客户端父类,这违背了拥有它们的目的......).
我想知道是否有办法让Auth控制器处于"中立"(?)并且能够从管理员/客户端控制器继承,所以如果X是基本控制器,并且Y是Auth ......
X -> Admin Controller -> Y
X -> Client Controller -> Y
Run Code Online (Sandbox Code Playgroud)
我正在使用一个身份验证库来封装一些较低级别的函数,而不是坚持布局逻辑和类似的东西.如果这是一个愚蠢的问题,请原谅我.谢谢!
多重继承是不可能的。您可以使用接口,也可以使用访问者设计模式,如下所示:
<?php
class A {
public $avar = 'I\'m A';
function accept(Visitor $v){
$v->visitA($this);
}
}
class B {
public $bvar = 'B reporting';
function accept(Visitor $v){
$v->visitB($this);
}
}
class Visitor {
function visitA(A $a){
echo $a->avar;
}
function visitB(B $b){
echo $b->bvar;
}
}
$A = new A();
$B = new B();
$visitor = new Visitor();
$A->accept($visitor);
$B->accept($visitor);
?>
Run Code Online (Sandbox Code Playgroud)
不幸的是,php 还没有准备好通过参数来区分方法调用,就像在 java 中一样,这个例子如下所示:
class A {
public String avar = 'I\'m A';
function accept(Visitor v){
v.visit(this);
}
}
class B {
public String bvar = 'B reporting';
function accept(Visitor v){
v.visit(this);
}
}
class Visitor {
function visit(A a){
System.out.println(a.avar);
}
function visit(B b){
System.out.println(b.bvar);
}
}
A = new A();
B = new B();
visitor = new Visitor();
A.accept(visitor);
B.accept(visitor);
Run Code Online (Sandbox Code Playgroud)
其中您有多种访问方法,通过其参数类型进行区分