PHP에서 코드 재사용에 관해 우리는 처음에 상속을 생각할 수 있습니다. 그러나 이 단일 상속 언어가 너무 많은 하위 클래스를 파생하면 부모 클래스에 대한 의존성, 너무 많은 결합 등 일련의 문제가 발생합니다. , 클래스의 캡슐화를 파괴합니다. 그렇다면 코드를 재사용할 수 있는 더 좋은 방법이 있을까요?
PHP 5.4.0부터 PHP는 특성이라는 또 다른 코드 재사용 방법을 구현했습니다.
Traits는 PHP와 같은 단일 상속 언어를 위해 준비된 코드 재사용 메커니즘입니다. 특성은 단일 상속 언어의 제약을 줄이고 개발자가 다양한 계층 내 독립 클래스의 메서드 세트를 자유롭게 재사용할 수 있도록 설계되었습니다. 특성 및 클래스 구성의 의미는 복잡성을 줄이고 전통적인 다중 상속 및 믹스인과 관련된 일반적인 문제를 방지하는 방법을 정의합니다.
특성의 사용은 매우 간단합니다. 수업에서 use 키워드를 사용하면 됩니다.
trait A { public function test() { echo 'trait A::test()'; } }class b { use A; }$b=new b();$b->test();
간단히 말하면 특성 우선순위는 상위 클래스 메서드보다 높지만 현재 클래스 메서드보다 낮습니다.
trait A { public function test() { echo 'trait A::test()'; } public function test1() { echo 'trait A::test1()'; } }class base{ public function test(){ echo 'base::test()'; } public function test1(){ echo 'base::test1()'; } }class b extends base{ use A; public function test(){ echo 'b::test()'; } }$b=new b();$b->test();//b::test()$b->test1();//trait A::test1()
여러 Trait을 사용할 때 동일한 메소드 이름이 존재하면 충돌이 발생합니다. 대신of와 as를 사용하여 메서드 이름 충돌 문제를 해결하세요
대신에 두 개의 동일한 메서드 이름을 사용하여 특정 메서드를 선언할 수 있습니다.
trait A { public function test() { echo 'trait A::test()'; } }trait B { public function test() { echo 'trait B::test()'; } }class c{ use A,B{ A::test insteadof B;//使用 insteadof 明确使用哪个方法 B::test as testB;//使用 as 修改另外一个方法名称,必须在使用 insteadof 解决冲突后使用 } }$c=new c();$c->test();//trait A::test()$c->testB();//trait B::test()
as 키워드를 사용하면 특성 메서드의 액세스 권한을 수정할 수 있습니다.
trait A { public function test() { echo 'trait A::test()'; } private function test1(){ echo 'trait A::test1()'; } }class b{ use A{ test as protected; test1 as public test2;//更改权限时还可以修改名称 } }$b=new b();$b->test();//Fatal error: Call to protected method b::test()$b->test2();//trait A::test1()
trait A { public function test1() { echo 'test1'; } } trait B { public function test2() { echo 'test2'; } } trait C { use A,B; } class D { use C; } $d = new D(); $d->test2(); //test2
Trait는 속성을 정의할 수 있지만 다음에서 정의할 수는 없습니다. 클래스 같은 이름의 attribute
trait A { public $test1; } class B { use A; public $test; public $test1;//Strict Standards: B and A define the same property ($test1) in the composition of B... }
Trait는 추상 메서드와 정적 메서드를 지원합니다. 정적 변수는 직접 정의할 수 없지만, 정적 변수는 특성 메서드에서 참조할 수 있습니다.
trait A { public function test1() { static $a = 0; $a++; echo $a; } abstract public function test2(); //可定义抽象方法 } class B { use A; public function test2() { } } $b = new B(); $b->test1(); //1 $b->test1(); //2
이 특성 사용의 사용 방법은 현재 개체의 실행 환경에 다른 개체를 마운트하는 javascript의 호출과 다소 유사할 것입니다. 물론 자바스크립트는 프로토타입 기반 언어입니다. 둘 사이에는 비교가 없습니다. 단지 사용법이 거의 동일하다는 점만 이해하시면 도움이 됩니다.
아아아아위 내용은 PHP의 특성 재사용 메커니즘 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!