[Laravel] Laravel에서 Trait 사용법 및 extends와의 비교
Trait의 정의 및 사용법
Trait 의 사용법
trait 정의
trait Rolable {
public function hasRole($role){
return 'user '.$role;
}
}
정의된 Trait을 호출하여 사용
use App\Traits\Rolable;
class User {
use Rolable; // use 라는 키워드를 사용하여 호출한다.
public function __construct()
{
echo $this->hasRole('client');
}
}
Trait을 사용하는 이유
PHP는 부모 클래스를 상속받기 위해 extends를 사용한다.
그러나 여기서 불편한점이 있는데 그것은 extends는 다중 상속을 받을 수없다.
즉 class child extends parent1Class, parent2Class.. 처럼 사용이 불가능하다.
그 대안으로 사용할 수 있는 것이 바로 Trait이다.
extends로 구성할 경우
한번의 extends 만을 사용할 수 있다.
- MyBaseController.php
class MyBaseController extends Controller {
protected $MySvc;
public function __construct() {
$this->MySvc = \App::make('Pondol\MyService');
}
}
- MyController.php
class MyController extends MyBaseController {
parent::__construct(); // MyBaseController 의 construct를 실행
}
trait으로 구성할 경우
여러개의 trait을 동시에 가져와서 사용 가능하다.
- MyBase.php
trait MyBase {
protected $MySvc;
// __construct() // trait에서는 construct가 존재 하지 않는다.
}
- MyController.php
use Pondol\MyService;
use MyBase;
class MyController extends Controller {
use MyBase;
public function __construct(
MyService $MySvc
) {
$this->MySvc = $MySvc;
}
}
extends를 사용할 경우 현재 컨트롤러가 부모컨트롤러의 속성을 상속 받는 다는 개념이지만
trait을 사용할 경우는 현재 컨트롤러가 trait의 메소드를 그냥 사용한다는 개념이다. 즉 trait 함수가 현재 컨트롤러의 변수를 사용한다.