可选的抽象方法

时间:2016-11-09 11:13:50

标签: php laravel laravel-5

我目前有一个抽象类,我将扩展到其他控制器。我在抽象类中有一个抽象函数,它接受值并将其放在__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 个答案:

答案 0 :(得分:1)

不可能abstract方法可选,因为PHP暗示所有抽象方法都必须具有实现。

可选抽象方法有合理用例,是:事件处理程序,元数据描述符等。不幸的是,您需要使用常规的非抽象方法,空体,并在 PHPDoc 中表明,除非扩展,否则他们什么都不做。

要小心谨慎:通过向孩子传播课堂责任感,这很快就会变成代码气味。如果您正在处理通用事件,则可以查看Laravel's own event systemObserver pattern

答案 1 :(得分:0)

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

在这种情况下,我会制作一个trait。在这里创建一个trait,可以由需要它的类实现。请注意use关键字用法,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

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