> 백엔드 개발 > PHP 문제 > PHP에서 특성 기능을 사용하는 방법

PHP에서 특성 기능을 사용하는 방법

醉折花枝作酒筹
풀어 주다: 2023-03-10 12:40:01
앞으로
2270명이 탐색했습니다.

이 글에서는 PHP에서 특성 기능을 사용하는 방법을 소개합니다. 도움이 필요한 친구들이 모두 참고할 수 있기를 바랍니다.

PHP에서 특성 기능을 사용하는 방법

모든 사람이 특성에 대해 잘 알고 있다고 생각합니다. 5.4부터 특성은 이미 PHP의 새로운 기능에 등장했습니다. 물론 특성 자체도 기능을 의미하지만 이 기능의 주요 기능은 코드 재사용을 위한 것입니다.

우리 모두는 PHP가 현대적인 객체 지향 언어라는 것을 알고 있습니다. C++에서 다중 상속의 혼란스러운 문제를 해결하기 위해 대부분의 언어는 단일 상속과 다중 인터페이스의 형태를 취하고 있지만, 이로 인해 조합을 사용하려면 재사용 가능한 코드도 일부 구현해야 합니다. , 클래스를 인스턴스화하거나 정적 메소드를 사용하려면 메모리 사용량이 증가하는 것은 불가피합니다. 이 문제를 해결하기 위해 PHP는 공식적으로 특성 기능을 출시했습니다. 콤보 능력의 변형이라고 생각하시면 됩니다.

trait A
{
    public $a = 'A';
    public function testA()
    {
        echo 'This is ' . $this->a;
    }
}

class classA
{
    use A;
}
class classB
{
    use A;
    public function __construct()
    {
        $this->a = 'B';
    }
}

$a = new classA();
$b = new classB();

$a->testA();
$b->testA();
로그인 후 복사

위 코드를 보면 어떤 클래스에도 특성을 적용할 수 있고 변수를 정의할 수 있어 매우 편리하다는 것을 알 수 있습니다. 특성에 대해 주목해야 할 가장 중요한 점은 동일한 이름을 가진 메서드의 오버로드 우선순위입니다.

trait B {
    function test(){
        echo 'This is trait B!';
    }
}
trait C {
    function test(){
        echo 'This is trait C!';
    }
}

class testB{
    use B, C;
    function test(){
        echo 'This is class testB!';
    }
}

$b = new testB();
$b->test(); // This is class testB!
// class testC{
//     use B, C;
// }

// $c = new testC();
// $c->test(); // Fatal error: Trait method test has not been applied, because there are collisions with other trait methods on testC
로그인 후 복사

여기서 test() 메서드는 우리 클래스에 오버로드되어 있고 여기에 출력되는 것은 클래스의 메서드입니다. testB 클래스의 test() 메서드를 주석 처리하면 오류가 보고됩니다. 프로그램은 사용하려는 특성의 test() 메서드를 구별할 수 없기 때문입니다. 사용할 메소드가 호출되는 특성을 지정하기 위해 대신 사용할 수 있습니다.

class testE{
    use B, C {
        B::test insteadOf C;
        C::test as testC;
    }
}
$e = new testE();
$e->test(); // This is trait B!
$e->testC(); // This is trait C!
로그인 후 복사

물론 실제 개발에서는 이러한 중복을 피하기 위해 메소드 이름을 표준화하도록 노력해야 합니다. 또한 하위 클래스가 특성을 참조하고 상위 클래스가 동일한 메서드를 정의하는 경우에는 어떻게 되나요? 물론 상위 클래스에서 상속된 메서드는 계속 호출됩니다. 특성의 우선순위는 일반 클래스 상속의 우선순위보다 낮습니다.

trait D{
    function test(){
        echo 'This is trait D!';
    }
}

class parentD{
    function test(){
        echo 'This is class parentD';
    }
}

class testD extends parentD{
    use D;
}

$d = new testD();
$d->test(); // This is trait D!
로그인 후 복사

마지막으로 추상 메서드도 특성에서 정의할 수 있습니다. 이 추상 메서드는 이 특성을 참조하는 클래스에서 반드시 구현해야 하는 메서드로, 추상 클래스의 추상 메서드와 동일한 효과를 갖습니다.

trait F{
    function test(){
        echo 'This is trait F!';
    }
    abstract function show();
}

class testF{
    use F;
    function show(){
        echo 'This is class testF!';
    }
}
$f = new testF();
$f->test();
$f->show();
로그인 후 복사

특성은 실제로 PHP의 매우 유연한 기능입니다. 물론, 유연성이 높을수록 예상치 못한 오류를 피하기 위해 일부 사용 규칙을 파악해야 합니다.

테스트 코드:

https://github.com/zhangyue0503/dev-blog/blob/master/php/201912/source/trait%E8%83%BD%E5%8A%9B%E5%9C%A8PHP%E4%B8%AD%E7%9A%84%E4%BD%BF%E7%94%A8.php
로그인 후 복사

추천 학습: php 비디오 튜토리얼

위 내용은 PHP에서 특성 기능을 사용하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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