PHP의 특성 재사용 메커니즘 사용에 대한 자세한 설명

黄舟
풀어 주다: 2023-03-15 20:12:02
원래의
1491명이 탐색했습니다.

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();
로그인 후 복사

Priority

간단히 말하면 특성 우선순위는 상위 클래스 메서드보다 높지만 현재 클래스 메서드보다 낮습니다.

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 충돌 문제

여러 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 중첩 사용

 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와 비교

이 특성 사용의 사용 방법은 현재 개체의 실행 환경에 다른 개체를 마운트하는 javascript의 호출과 다소 유사할 것입니다. 물론 자바스크립트는 프로토타입 기반 언어입니다. 둘 사이에는 비교가 없습니다. 단지 사용법이 거의 동일하다는 점만 이해하시면 도움이 됩니다.

아아아아

위 내용은 PHP의 특성 재사용 메커니즘 사용에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿