2016-11-09 141 views
3

我目前有一个抽象类,我正在扩展到其他控制器。我在抽象类中有一个抽象函数,它取值并将其放在__construct中。可选的抽象方法

abstract class Controller extends BaseController { 
    abstract public function something(); 

    public function __construct(Request $request) { 
     if (!is_null($this->something())){ 
      $this->global_constructor_usse = $this->something(); 
     } 
    } 
} 

我的问题是,在不需要此抽象函数的控制器上,我不得不放置在空函数中。

class ControllerExample extends Controller { 
    public function something(){ 
     return 'somethinghere'; 
    } 
} 

有没有办法使抽象函数可选或具有默认值?

class EmptyControllerExample extends Controller { 
    public function something(){} 
} 

或者什么是最好的方法去做这件事?

+2

在Controller抽象类中给它一个默认的主体,即使它只是'return;'。然后在需要它的子类中覆盖它。没有像“可选抽象方法”这样的东西。 –

+0

我收到以下错误:'抽象函数App \ Http \ Controllers \ Controller :: Upload()不能包含主体'你能举一个例子吗? – jagmitg

+0

@JSG因为它不能是'抽象的'并且有一个身体。如果它有一个body,你不能在方法sig中使用'abstract'。 –

回答

0

父类中的抽象函数只能在您的应用程序需要它在继承它的所有控制器中实现以下方法时才使用,显然情况并非如此。

在这种情况下,我会做一个trait。在这里你创建一个trait,可以由需要它的类来实现。请注意0​​关键字的使用,use somethingTrait;

trait somethingTrait 
{ 
    public function something() 
    { 
     echo "something called"; 
    } 
} 

class Controller 
{ 
    use somethingTrait; 

    public function run() 
    { 
     $this->something(); 
    } 
} 

phpfiddle link

另一种形式给出可以做一个class继承结构,如果你想控制器实现方法都有一些共同点。您可以在CrmController的哪个位置实施您的特殊方法,您仍然可以在抽象控制器中创建共享methods

        AbstractController 
             | 
            CrmController 
             | 
            CompanyController 

对于你的问题'有无论如何使抽象函数可选或具有默认值?'不,如果您试图将抽象函数设为可选,那么您就错了。希望我的建议可以帮助。

0

不可能有一个abstract方法可选,因为它暗示在PHP中,所有的抽象方法必须有一个实现。

有合法的使用情况可选抽象方法,是:事件处理,元数据描述者,等等。不幸的是,你需要使用常规,非抽象方法有一个空的身体,并在PHPDoc的指示他们什么也不做,除非扩展。

不过要小心:这可以很快地变成代码味道,通过与他们的孩子分享班级责任。如果您正在处理通用事件,则可以查看Laravel's own event systemObserver pattern