【发布时间】:2015-11-26 17:06:08
【问题描述】:
我写了一个小的抽象类,叫做Task。我喜欢让每个任务逻辑的类来扩展它。
在我的抽象类“任务”中,我喜欢将每个类中定义的已用定义方法称为“执行”。
我尝试使用魔术方法__call,但它不起作用。
如果您在我的方法中注意到我正在回显一条永远不会在屏幕上打印的消息。
这是我的抽象任务类
<?php
namespace App\Modules\Surveys\Tasks;
use App\Modules\Surveys\Tasks\Support\Traits\HtmlHelper;
abstract class Task
{
/*
|
| This task base class provides a central location to place any logic that
| is shared across all of your tasks.
|
*/
use HtmlHelper;
/**
* checks wether a get method execute exists and calls it
*
* @param string $name
* @param array $args optional
* @return mixed
*/
public function __call($name, $args = [])
{
echo 'Attempt to execute task';
if (method_exists($this, 'execute')) {
return call_user_func_array('execute', $args);
} else {
throw new \Exception('execute method does does not exists in your task! ' . get_class($this) );
}
}
}
?>
这是一个逻辑类
<?php
namespace App\Modules\Surveys\Tasks\Interviews;
use App\Modules\Surveys\Tasks\Task;
use App\Modules\Surveys\Models\SurveyInterview;
use Exception;
class ResumeInterview extends Task
{
protected $surveyId;
protected $callId;
protected $myInterview;
/**
* Create a new task instance.
*
* @return void
*/
public function __construct($surveyId, $callId)
{
$this->surveyId = intval($surveyId);
$this->callId = intval($callId);
}
/**
* Resume existing interview if one exists using the giving $surveyId and $callId
*
* @return void
*/
protected function execute()
{
//find the current interview if one exits
$myInterview = SurveyInterview::surveyAndCall($this->surveyId, $this->callId)->first();
$this->setInterview($myInterview);
if( $this->wasResumed() ){
//At this point existing interview was found
if($myInterview->status != 'Pending'){
//At this point the interview is completed and should not be conducted
throw new Exception('This interview can not not be retaken. It\'s current status is "' . $myInterview->status . '"');
}
}
}
/**
* Return the current interview
*
* @return App\Models\Survey\SurveyInterview
*/
public function getInterview()
{
return $this->myInterview;
}
/**
* It checks whether ot the the interview was resumed
*
* @return boolean
*/
public function wasResumed()
{
return $this->getInterview() ? true : false;
}
/**
* It sets the interview
*
* @param Illuminate\Support\Collection $myInterview
* @param void
*/
protected function setInterview($myInterview)
{
$this->myInterview = $myInterview;
}
}
如果execute方法存在,如何自动调用,否则抛出异常?
【问题讨论】:
-
为什么不在你的父类构造函数中做这个,然后在子类中做
parent::__construct();?
标签: php class call magic-methods