Ich wiederhole mich ständig und zittere vor Atem: Wann werde ich aufstehen können?

autoload
Freigeben: 2023-04-09 19:28:02
Original
2201 Leute haben es durchsucht

Wie können bestimmte Mitglieder einer Klasse von anderen Klassen verwendet werden? Wenn Vererbung verwendet wird, ist die Vererbungskette zu lang. Der Einfachheit halber stellt PHP die Eigenschaft der Code-Wiederverwendungstechnologie bereit.

1. Definition : Trait ist ein Code-Wiederverwendungsmechanismus, der für Einzelvererbungssprachen wie PHP vorbereitet ist. Merkmale können dazu beitragen, dass Sprachen mit einfacher Vererbung die peinliche Situation loswerden, dass sie zur Wiederverwendung erben müssen, wodurch objektorientiert reiner wird. 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>";
        }
    }
?>
Nach dem Login kopieren

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

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

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();
?>
Nach dem Login kopieren

一个类可以使用多个trait。

<?php
   trait A1{
   }
   trait A2{
   }
   class People{
     use A1,A2;
   }
?>
Nach dem Login kopieren

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();
  

?>
Nach dem Login kopieren

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();
?>
Nach dem Login kopieren

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();
?>
Nach dem Login kopieren

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
?>
Nach dem Login kopieren

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

2. Grundlegende Syntax : Trait ist ein Schlüsselwort, das class ähnelt.

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

   class Animal{
    use Eat;
    public function eat(){		//具体类:实现抽象方法
        echo &#39;Animal::eat&#39;;	
    }		
}
?>
Nach dem Login kopieren
 trait wird zur Wiederverwendung von Code verwendet und kann nicht instanziiert oder vererbt werden (da es überhaupt keine Klasse ist). 🎜rrreee🎜🎜 3. Die Verwendung von Merkmalen 🎜🎜🎜 Merkmale sind lediglich eine Sammlung von Codes, die mit use referenziert werden müssen.
🎜rrreee🎜 Eine Klasse kann mehrere Merkmale verwenden. 🎜rrreee🎜🎜 4. Probleme bei der Verwendung von Merkmalen 🎜🎜🎜🎜 🎜 a. Wenn mehrere gleichzeitig eingeführte Merkmale Attribute mit demselben Namen haben, kommt es zu Konflikten. 🎜rrreee🎜 Wenn in mehreren Merkmalen gleichzeitig Methoden mit demselben Namen vorhanden sind, treten Konflikte auf. Es gibt zwei Lösungen, z. B. A3 und A4. 🎜rrreee🎜 c. Problem mit der Abdeckung gleicher Namen: Wenn es in der Klasse ein Mitglied mit demselben Namen wie das eingeführte Merkmal gibt, wird es anders behandelt: 🎜
  • 🎜 Attribut: Duplizierung ist nicht zulässig Name, das heißt, die Klasse darf keine Mitgliedsattribute mit demselben Namen wie das Merkmal definieren (dasselbe gilt für statische Attribute). 🎜
  • 🎜 Methode: Die Klasse deckt das Merkmal ab. 🎜
🎜 d. Vererbungsabdeckungsproblem: Wenn eine Klasse trait verwendet, erbt sie auch von der übergeordneten Klasse und das Merkmal hat eine Methode mit demselben Namen wie die übergeordnete Klasse Klasse, dann überschreibt trait die Methode der übergeordneten Klasse mit demselben Namen; wenn Sie auf die Methode der übergeordneten Klasse zugreifen möchten, können Sie das Schlüsselwort parent verwenden die Trait-Methode mit demselben Namen, um auf die Methode der übergeordneten Klasse mit demselben Namen zuzugreifen. 🎜rrreee🎜 Auf e.trait selbst kann nicht zugegriffen werden. Es wird nur zur Wiederverwendung von Code für andere Klassen verwendet. Daher dürfen Klassen bei der Verwendung von Merkmalen eine höhere Zugriffskontrolle verwenden: Verwenden Sie nach as den Zielzugriff Modifikator-Qualifizierer. 🎜rrreee🎜 Sie können abstrakte Methode in f.trait verwenden, und die verwendende Klasse muss die entsprechende abstrakte Methode implementieren: Die verwendende Klasse muss entweder eine abstrakte Klasse sein oder es muss eine abstrakte Methode implementieren. 🎜rrreee🎜empfohlen: 🎜php-Tutorial🎜, 🎜php-Video-Tutorial🎜🎜

Das obige ist der detaillierte Inhalt vonIch wiederhole mich ständig und zittere vor Atem: Wann werde ich aufstehen können?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!