이 글에서는 특정 참조 값을 갖는 [php 클래스 및 객체] 특성을 소개합니다. 이제 필요한 친구들이 참조할 수 있습니다.
특성(PHP 5.4.0)
번역 특성
Trait는 PHP와 같은 단일 상속 언어를 위해 준비된 코드 재사용 메커니즘입니다.
Trait는 단일 상속 언어의 제한을 줄이고 개발자가 다양한 계층 내의 독립 클래스에서 메서드를 자유롭게 재사용할 수 있도록 설계되었습니다.
특성은 클래스와 유사하지만 기능을 세밀하고 일관된 방식으로 결합하도록 설계되었습니다.
Trait는 전통적인 상속에 수평적 기능의 조합을 추가합니다. 즉, 애플리케이션의 여러 클래스 간에 상속이 필요하지 않습니다.
Priority
기본 클래스에서 상속된 멤버는 특성에 의해 삽입된 멤버에 의해 재정의됩니다. 우선 순위는 현재 클래스의 멤버가 특성의 메서드를 재정의하고 특성이 상속된 메서드를 재정의하는 것입니다.
(메서드나 속성의 이름이 같은 경우 현재 클래스의 메서드는 특성의 메서드를 재정의하고 특성의 메서드는 기본 클래스의 메서드를 재정의합니다.)
#Example #2 优先顺序示例<?phpclass Bases { public function sayHello() { echo 'Hello '; } }trait SayWorld { public function sayHello() { parent::sayHello(); echo 'World!'; } }class MyHelloWorld extends Bases { // public function sayHello(){ // echo 'the class'; // } use SayWorld; }$o = new MyHelloWorld();$o->sayHello(); //output: Hello World!?>
Example #3 另一个优先级顺序的例子<?phptrait HelloWorld { public function sayHello() { echo 'Hello World!'; } }class TheWorldIsNotEnough { use HelloWorld; public function sayHello() { echo 'Hello Universe!'; } }$o = new TheWorldIsNotEnough();$o->sayHello(); //output: Hello Universe!?>
다중 특성
으로 구분 use 문에 있는 쉼표는 클래스에 모두 삽입할 수 있는 여러 특성을 나열합니다.
Example #4 多个 trait 的用法<?phptrait Hello { public function sayHello() { echo 'Hello '; } }trait World { public function sayWorld() { echo 'World'; } }class MyHelloWorld { use Hello, World; public function sayExclamationMark() { echo '!'; } }$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();$o->sayExclamationMark();//output: Hello World!?>
이름 지정 충돌
두 특성이 충돌을 명시적으로 해결하지 않고 동일한 이름의 메서드를 삽입하면 치명적인 오류가 발생합니다.
동일한 클래스에 있는 여러 특성의 이름 충돌을 해결하려면 대신 연산자를 사용하여 사용할 충돌 방법을 명시적으로 지정해야 합니다.
위 메서드는 다른 메서드만 제외할 수 있으며 as 연산자는 메서드에 대한 별칭을 도입할 수 있습니다. as 연산자는 메서드의 이름을 바꾸거나 해당 메서드에 영향을 주지 않습니다.
<?phptrait A { public function a() { echo 'a1'; } public function b() { echo 'a2'; } }trait B { public function a() { echo 'b1'; } public function b() { echo 'b2'; } }class C { use A, B { B::a insteadof A;//insteadof 指定B类中的a方法在A类中,以解决命名冲突 B::b insteadof A; A::a as a1;//把A类中的a方法取别名为a1,以解决命名冲突 A::B as a2; } }$C = new C();$C -> a();//b1$C -> b();//b2$C -> a1();//a1$C -> a2();//a2?>
as
메소드의 액세스 제어를 수정할 수도 있습니다.
Example #6 修改方法的访问控制<?php trait Hello { public function traitHello() { echo "hello,trait\n"; } } // 修改 traitHello 的访问控制 class Class1 { use Hello { traitHello as protected; } } // 给方法一个访问控制的别名,原版 traitHello 的访问控制则没有发生变化 class Class2 { use Hello { Hello::traitHello as private hi; } } $Obj1 = new Class1(); // $Obj1->traitHello(); # 报致命错误,因为traitHello方法被修改成受保护的 $Obj2 = new Class2(); $Obj2->traitHello(); # 原来的traitHello方法仍然是公共的 // $Obj2->hi(); # 报致命错误,因为别名hi方法被修改成私有的
Trait는 Trait을 결합할 수도 있습니다
Trait는 추상 메소드, 정적 속성 및 정적 메소드를 지원합니다.
<?phptrait Hello { public function sayHello() { echo "Hello\n"; } }trait World { use Hello; public function sayWorld() { echo "World\n"; } abstract public function getWorld(); public function inc() { static $c = 0; $c = $c + 1; echo "$c\n"; } public static function doSomething() { echo "Doing something\n"; } }class HelloWorld { use World; public function getWorld() { return 'get World'; } }$Obj = new HelloWorld();$Obj->sayHello();//Hello$Obj->sayWorld();//Worldecho $Obj->getWorld() . "\n";////get WorldHelloWorld::doSomething();//Doing something$Obj->inc();//1$Obj->inc();//2
Trait 속성을 정의한 후에는 클래스가 다음을 수행할 수 없습니다. 같은 이름의 속성을 정의해야 합니다. 그렇지 않으면 치명적인 오류가 발생합니다. 한 가지 예외가 있습니다. 속성은 호환됩니다(동일한 액세스 가시성, 초기 기본값). PHP 7.0 이전에는 속성이 호환되면 E_STRICT 알림이 있었습니다.
Example #12 解决冲突<?phptrait PropertiesTrait { public $same = true; public $different = false; }class PropertiesExample { use PropertiesTrait; public $same = true; // PHP 7.0.0 后没问题,之前版本是 E_STRICT 提醒 public $different = true; // 致命错误}?>
관련 권장 사항:
위 내용은 [PHP 클래스 및 객체] 특성의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!