>  기사  >  백엔드 개발  >  계속해서 숨이 막힐 정도로 반복하는데 나는 언제쯤 일어설 수 있을까?

계속해서 숨이 막힐 정도로 반복하는데 나는 언제쯤 일어설 수 있을까?

autoload
autoload원래의
2021-03-04 17:39:072157검색

클래스의 특정 멤버를 다른 클래스에서 어떻게 사용할 수 있나요? 상속을 사용하면 상속 체인이 너무 길어집니다. 편의상 PHP는 코드 재사용 기술 특성을 제공합니다.

1. 정의 : Trait는 PHP와 같은 단일 상속 언어​​를 위해 준비된 코드 재사용 메커니즘입니다. 특성은 단일 상속 언어가 재사용을 위해 상속해야 하는 당황스러운 상황을 제거하여 객체 지향을 더 순수하게 만드는 데 도움이 될 수 있습니다. Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。trait可以使得单继承语言摆脱为了复用,而不得不继承的尴尬处境,让面向对象变得更加纯粹。

  2.基础语法

     trait是一种类似class的关键字。

<?php
     trait Eat{
        public $a=10;      //trait内允许有类的成员属性(包括静态属性),成员方法(包括静态方法)
        public static $b=666;
        //const c=3.14;       //trait内不允许有常量
        protected $e;	//允许定义,但是实际不用
        private $f;
        public function getA()
        {
               echo $this->a,"<br>";
        }
        public static function getB()
        {
               echo self::$b,"<br>";
        }
    }
?>

     trait是用来实现代码的复用的,不可以被实例化也不可以被继承(因为根本不是类)。

<?php
   trait Eat{}
  // $a=new Eat;//报错
  //calss A extends Eat{}//报错
?>

  3.trait的使用

     trait只是一段代码的集合,使用时必须要使用use进行引用。

<?php
    
    trait Eat{
        public $a=10;
        public static $b=666;
        //const c=3.14;
        public function getA()
        {
               echo $this->a,"<br>";
        }
        public static function getB()
        {
               echo self::$b,"<br>";
        }
    }
    
    class A{
        use Eat;


        public function getC()
        {
            echo $this->a,"<br>";
        }
    }

    $boy=new A();
    $boy->getC();
    $boy->getA();
    $boy->getB();
?>

      一个类可以使用多个trait。

<?php
   trait A1{
   }
   trait A2{
   }
   class People{
     use A1,A2;
   }
?>

  4.trait使用的问题

      a.如果同时引入的多个trait中有同名属性,那么会产生冲突。

<?php
    trait A1{
       public $a=11;
    }
    trait A2{
       public $a=22;
    }

    class A3{
        use A1,A2;//不允许同名属性
        public function geta(){
            echo $this->a;
        }
    }

    $example=new A3();
  

?>

     b.如果同时引入的多个trait中有同名方法,那么会产生冲突,有两种方案解决如A3、A4。

<?php
    trait A1{
       public $a=11;
       public function eat(){
           echo "A1中eat()方法","<br>";
       }
    }
    trait A2{
       public $b=22;
       public function eat(){
        echo "A2中eat()方法","<br>";
      }
    }

    class A3{
        use A1,A2{
          A1::eat insteadOf A2; //A1中的eat替代A2中的eat
        }
    }
    class A4{
        use A1,A2{
            A1::eat insteadOf A2;//A1中的eat替代A2中的eat
            A2::eat as eat2;     //A2中的eat取别名eat2
          }
    }

    $example=new A3();
    $example->eat();
    $example=new A4();
    $example->eat2();
?>

    c.同名覆盖问题:如果类中有与引入的trait同名成员,会有不同处理:

  •   属性:不允许重名,即类中不允许定义与trait中同名的成员属性(静态属性也一样)。

  •  方法:类覆盖trait。

    d.继承覆盖问题:如果类中在使用trait的同时,也是继承自父类,而trait中与父类中有同名方法,那么trait中将覆盖父类同名方法;如果要访问父类方法,可以在trait同名方法中使用parent关键字访问父类同名方法。

<?php
    trait Eat{
    public function eat(){
        echo &#39;Eat::eat&#39;;
    }
}
    class Human{
    public function eat(){
        echo &#39;Human::eat&#39;;
    }
}
//子类继承父类同时使用trait
class Man extends Human{
    use Eat;
}

$m = new Man();
$m->eat();
?>

    e.trait自己不能访问,只是用来给其他类提供代码复用的,因此允许类在使用trait时,使用更高的访问控制权:在as之后,使用目标访问修饰限定符。

<?php
trait Eat{
    private function show(){
        echo &#39;eat&#39;;
    }
}
class Human{
    use Eat{
        show as public eshow;				
        //注意:as是用来设定别名的,虽然没有同名show,但是系统认为show已经存在,所以必须别名,权限的更改的方法不是
        //本尊
    }
}
$h = new Human();
$h->eshow();								//eat
?>

   f.trait中可以使用抽象方法,使用类必须实现对应抽象方法

2. 기본 구문 : Trait은 class와 유사한 키워드입니다.

<?php
   trait Eat{
     public function eat();		//抽象方法
   }
   abstract class Human{			
    use Eat;					//抽象类:可以不实现抽象方法
   }

   class Animal{
    use Eat;
    public function eat(){		//具体类:实现抽象方法
        echo &#39;Animal::eat&#39;;	
    }		
}
?>

 trait는 코드 재사용을 위해 사용되며 클래스가 아니기 때문에 인스턴스화하거나 상속할 수 없습니다. 🎜rrreee🎜🎜 3. 특성의 사용 🎜🎜🎜 특성은 코드 모음일 뿐이며 use를 사용하여 참조해야 합니다.
🎜rrreee🎜 클래스는 여러 특성을 사용할 수 있습니다. 🎜rrreee🎜🎜 4. 특성 사용 문제 🎜🎜🎜🎜 🎜 a. 동시에 도입된 여러 특성에 동일한 이름의 특성이 있으면 충돌이 발생합니다. 🎜rrreee🎜 b. 동시에 도입된 여러 특성에 동일한 이름의 메서드가 있으면 충돌이 발생합니다. A3, A4 등 두 가지 솔루션이 있습니다. 🎜rrreee🎜 c. 동일 이름 적용 문제: 클래스에 도입된 특성과 동일한 이름을 가진 멤버가 있는 경우 다르게 처리됩니다. 🎜
  • 🎜 속성: 이름 중복은 허용되지 않습니다. 즉, 클래스는 특성과 동일한 이름을 가진 멤버 속성을 정의할 수 없습니다(정적 속성의 경우에도 마찬가지). 🎜
  • 🎜 방법: 수업은 특성을 다룹니다. 🎜
🎜 d. 상속 범위 문제: 클래스가 trait를 사용하는 경우 상위 클래스에서도 상속되며 해당 특성에는 상위 클래스와 동일한 이름의 메서드가 있습니다. 클래스를 사용하면 trait는 상위 클래스의 메서드를 동일한 이름으로 덮어씁니다. 상위 클래스의 메서드에 액세스하려면 다음에서 parent 키워드를 사용할 수 있습니다. 동일한 이름을 가진 상위 클래스의 메소드에 액세스하려면 동일한 이름을 가진 특성 메소드를 사용하십시오. 🎜rrreee🎜 e.trait 자체에는 액세스할 수 없습니다. 이는 다른 클래스에 대한 코드 재사용을 제공하는 데만 사용됩니다. 따라서 클래스는 특성을 사용할 때 더 높은 액세스 제어를 사용할 수 있습니다. as 다음에 Target 액세스를 사용하세요. 수정자 한정자. 🎜rrreee🎜 f.trait에서 추상 메서드를 사용할 수 있으며 사용 클래스는 해당 추상 메서드를 구현해야 합니다. 사용 클래스는 추상 클래스이거나 추상 메소드를 구현해야 합니다. 🎜rrreee🎜추천: 🎜php 튜토리얼🎜, 🎜php 비디오 튜토리얼🎜🎜

위 내용은 계속해서 숨이 막힐 정도로 반복하는데 나는 언제쯤 일어설 수 있을까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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