[Laravel] Laravel에서 Trait 사용법 및 extends와의 비교

[Laravel] Laravel에서 Trait 사용법 및 extends와의 비교 updated_at: 2024-07-23 18:35

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 함수가 현재 컨트롤러의 변수를 사용한다.

평점을 남겨주세요
평점 : 5.0
총 투표수 : 1

질문 및 답글