특성 사용법

WBOY
WBOY원래의
2016-07-29 09:15:161461검색
원본 출처: http://blog.csdn.net/longlongmylove/article/details/7521379
php5.4 새로운 기능 소개1. 특성
특성은 코드 재사용을 위해 5.4에 추가된 새로운 방법입니다. PHP는 단일 상속 언어입니다. Java와 같은 코드 재사용을 달성하기 위해 하나의 클래스에서 여러 기본 클래스를 확장할 수 없습니다. 이제 Traits는 이 코드 재사용 문제를 해결하여 개발자가 여러 다른 클래스에서 코드 재사용을 구현할 수 있습니다.
특성과 클래스의 의미론적 정의는 코드의 복잡성을 줄이고 다중 상속 문제를 방지하는 것입니다. 특성은 클래스와 유사하지만 통합되고 세분화된 방식으로 함수 집합을 제공하는 데만 사용됩니다. 특성은 특성 내부에서 인스턴스화할 수 없습니다. 즉, 클래스와 유사한 생성자 __construct(가 없습니다. ). 특성은 PHP 기존 상속의 확장 역할을 하며 수평 통합을 구현하므로 애플리케이션 클래스에서는 더 이상 상속이 필요하지 않습니다. 1)
을 사용하여 클래스에서 키워드 'use'를 사용하여 특성을 참조하는 방법입니다. 여러 특성은 ','로 구분됩니다. 예제 코드는 다음과 같습니다.

[php] view 일반 사본

  1. 특성 ezcReflectionReturnInfo { 
  2. 함수 getReturnType() { 
  3. 함수 getReturnDescription() {
  4. }
  5. }class ezcReflectionMethod 확장 ReflectionMethod {
  6. 사용 ezcReflectionReturnInfo
  7. /* … */ 
  8. 클래스 ezcReflectionFunction 확장 ReflectionFunction { ezcReflectionReturnInfo;
  9. /* ... */
  10. } ?>
  11. 2) 우선순위기본 클래스의 멤버 함수는 Traits의 함수 적용 범위를 의미합니다. 이는 현재 클래스의 멤버 함수가 Traits의 함수를 재정의한다는 의미입니다.
[php] 보기 일반 사본
  1. class 기본 {  
  2.     공개 함수 sayHello() {  
  3. 에코 '안녕하세요';  
  4.     }  
  5. }  
  6.   
  7. 특성 SayWorld {  
  8.     공개 기능 sayHello() {  
  9.         parent::sayHello();  
  10.         에코 "World!n";  
  11.     }  
  12. }  
  13.   
  14. class MyHelloWorld 확장 Base {  
  15.     사용 SayWorld;  
  16. }  
  17.   
  18. 수업 MyHelloWorldExt 확장 Base {  
  19.     사용 SayWorld;  
  20.     공개 함수 sayHello() {  
  21.         /**
  22. * 5.4의 새로운 변경 사항은 다음과 같습니다. 5.4 이전 버전에서는 다음 메시지가 표시됩니다.
  23. * PHP 치명적인 오류: 문자열 오프셋을 배열로 사용할 수 없습니다
  24. * 5.4에서 개선되어 문자열에서 인덱스 번호의 문자를 반환합니다.
  25. */  
  26.         $str"아르빈";  
  27.         에코 $str[0][0];// 에코 'A';  
  28.     }  
  29.   
  30.     공개 함수 shortArray() {  
  31.          $array = ['첫 번째', 2, 3, 4];//5.4中的数组简单语법   
  32.         에코 $array[0];//5.4中的数组解引用取数组元素方法  
  33.     }  
  34. }  
  35.   
  36. $o =  MyHelloWorld( );  
  37. $o->sayHello();  
  38. $oe = new MyHelloWorldExt();  
  39. $oe->sayHello();  
  40. 에코 "n";  
  41. $oe->shortArray();  

[php] 보기 일반 사본

  1. 输출:  
  2. Hello World!  
  3. 아  
  4. 먼저  
3) 다중 특성클래스 선언에 다중 특성을 추가할 수 있으며, 다중 특성은 ","로 구분됩니다.

[php] 보기 일반 사본

  1. 특성 안녕하세요 { 
  2. public function sayHello() {
  3. echo '안녕하세요' 🎜>
  4. 특성세계 {
  5. 공개
  6. 함수 sayWorld() {
  7. 에코 '세계'
  8. class MyHelloWorld { 사용
  9. Hello World
  10. }
  11. $o = new
  12. MyHelloWorld() $o
  13. ->안녕하세요( );
  14. $o
  15. ->sayWorld() ?> 출력 결과: 4) 다중 특성 충돌 동일한 클래스에 두 개의 특성이 추가된 경우 명시적인 처리 없이 동일한 함수 이름을 사용하면 오류가 생성됩니다. 같은 클래스의 Tratis에서 같은 이름을 가진 두 함수 간의 충돌을 해결하려면 대신 연산자를 사용하여 올바른 함수를 선택해야 합니다.
  16. 메서드의 고유성과 배타성으로 인해 내부 충돌을 해결하기 위해 충돌하는 함수 뒤에 'as' 연산자를 사용할 수 있습니다.
  17. [php] 보기 일반 사본
    1. 특성 A {  
    2. 공개  기능 smallTalk() {  
    3. 에코 '아';  
    4. }  
    5. 공개 기능 bigTalk() {  
    6. 에코 'A';  
    7. }  
    8. }  
    9.   
    10. 특성 B {  
    11. 공개 기능 smallTalk() {  
    12. 에코 'b';  
    13. }  
    14. 공개 기능 bigTalk() {  
    15. 에코 'B';  
    16. }  
    17. }  
    18.   
    19. 수업 화자 {  
    20. 사용 A, B {  
    21. A 대신 B::smallTalk;  
    22. B 대신 A::bigTalk;  
    23. }  
    24. }  
    25.   
    26. class Aliased_Talker {  
    27. 사용 A, B {  
    28. A 대신 B::smallTalk;  
    29. B 대신 A::bigTalk;  
    30. B::bigTalk  대화;  
    31. }  
    32. }  
    33. ?>  
    상면적例子中,Talker使用 특성 A 와 B,因此两者中상동적函数name称存재冲突。
    alker中定义了smallTalk取自Traits B ,bigTalk取自Traits A.
    Aliased_Talker중간 Commun过使는 操작품 B중의 bigTalk통신 来确保Traits B중의 bigTalk통신 过别nametalk来实现으로 사용됩니다.
    5)改变函数访问权限
    我们可以使는语法来改变특성으로 사용됩니다.中函数的访问权限属性。

    [php] 보기 일반 사본

    1. 특성 HelloWorld {  
    2. 공개 함수 sayHello() {  
    3. 에코 'Hello World!';  
    4. }  
    5. }  
    6.   
    7. // sayHello의 공개 상태 변경,改变sayHello的访问权限。  
    8. 클래스 MyClass1 {  
    9. 사용 HelloWorld { sayHello  보호됨 ; }  
    10. }  
    11.   
    12. // 별칭 메서드가 변경됨 가시성  
    13. // sayHello 가시성 변경되지 않음,设置别namemyPrivateHello。  
    14. class MyClass2 {  
    15. 사용 HelloWorld { sayHello   비공개 myPrivateHello; }  
    16. }  
    17. ?>  
     6) 특성은 새로운 특성을 형성합니다
    많은 클래스와 마찬가지로 특성은 클래스에서 사용할 수 있고 특성은 특성에서 사용할 수 있습니다. 하나 이상의 특성은 하나의 특성에 정의될 수 있으며, 이러한 특성은 일부 또는 전체 구성원으로 다른 특성에 정의될 수 있습니다.

    [php] 보기 일반 사본

    1. 특성 안녕하세요 { 
    2. public function sayHello() {
    3. echo '안녕하세요'
    4. } 🎜>
    5. 특성 세계 {
    6. 공개
    7. 함수 sayWorld() { 에코
    8. '세상!' } >특성 HelloWorld {
    9. 사용
    10. Hello, World
    11. }
    12. 클래스 MyHelloWorld {
    13. 사용
    14. HelloWorld
    15. } 🎜>$o =
    16. MyHelloWorld()
    17. $o ->sayHello();
    18. ?> 위 루틴은 다음을 출력합니다:
    19. [php] view 일반 사본 Hello World!
    20. 7) Abstract Trait 멤버 특정 메소드를 강제로 구현하기 위해 Traits에서 추상 메소드를 사용할 수 있습니다. 예:
    21. [php] 보기 일반 사본
      1. 특성 안녕하세요 {  
      2.     공개  함수 sayHelloWorld() {  
      3.         에코 '안녕하세요'.$this->getWorld();  
      4.     }  
      5.     추상 공개 함수 getWorld();  
      6. }  
      7.   
      8. 수업 MyHelloWorld {  
      9.     비공개 $world;  
      10.     사용 안녕하세요;  
      11.     공개 함수 __construct($world) {  
      12.         $this->world = $world;  
      13.     }  
      14.     공개 기능 getWorld() {  
      15.         return $this->world;  
      16.     }  
      17. }  
      18.   
      19. /**
      20. * 여기에서는 새로운 5.4 기능 클래스 인스턴스 역참조 작업이 사용됩니다.
      21. * ( new class())->method();
      22. */  
      23. (신규 MyHelloWorld('아르빈'))->sayHelloWorld();  
      24. ?>  
      25.   
      26. 该实例输出:  
      27. 안녕하세요 Arvin  
       8)静态Trait成员在Traits中不能定义static 静态变weight,但是可以定义在Tratis的函数中。Tratis中样可以定义静态函数.

      [php] 보기 일반 사본

      1. trait Counter {
      2. public function inc() {
      3. static $c = 0;//静态变量
      4. $c += 1;
      5. echo "$c\n";
      6. }
      7. /**
      8. * 静态方法
      9. */
      10. public static function doSomething() {
      11. echo 'Doing something';
      12. }
      13. }
      14. class C1 {
      15. use Counter;
      16. }
      17. (new C1())->inc(); // echo 1  
      18. C1::doSomething();  
      19. ?>  
      20. 输出为:  
      21. 1  
      22. Doing something  
      9) Traits 定义属性如果在一个trait中定义了一个属性,则在引用该trait的类中不能定义同名的属性,如果该类中定义有和trait中已定义属性具有相同的名字和访问可见性,则是一个E_STRICT 提示,否则抛出语法错误。
      <?php
      trait PropertiesTrait {
          public $x = 1;
      	public $y = 2;
      }
      
      class PropertiesExample {
          use PropertiesTrait;
      	public $x = 1;
      	//public $y = 3;
      }
      
      $example = new PropertiesExample;
      echo $example->x, $example->y;
      ?>
      
      输出:
      12
       在最后贴上php5.4.0部分新功能changelog:
      Added short array syntax support ([1,2,3]), see UPGRADING guide for full details.
      Added binary numbers format (0b001010).
      Added support for Class::{expr}() syntax.
      Added support for Traits.//本文的主要内容
      Added closure $this support back.
      Added array dereferencing support.//数组解引用支持,上文中有实例
      Added callable typehint.
      Added indirect method call through array. #47160.
      Added DTrace support.//传说DTrace是一个性能分析工具,可以跟踪出函数调用点,返回点等数据
      Added class member access on instantiation (e.g. (new foo)->bar()) support.//类新实例解引用操作,上文中有实例
      本文旨在抛砖引玉,希望大家一起继续探究php5.4的新功能。^_^

      以上就介绍了Traits的用法,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.