息を震わせながら繰り返す、いつになったら立ち上がれるのか?

autoload
リリース: 2023-04-09 19:28:02
オリジナル
2200 人が閲覧しました

クラスの一部のメンバーを他のクラスが使用するにはどうすればよいでしょうか?継承を使用すると、継承チェーンが長すぎるため、便宜上、PHP にはコード再利用テクノロジ特性が提供されます。

1. 定義 : Trait は、PHP と同様の 単一継承言語 用に用意されたコード再利用機構です。トレイトにより、 単一継承言語は、再利用のために継承しなければならないという恥ずかしい状況を 取り除くことができ、 オブジェクト指向 をより純粋なものにすることができます。

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. 特性の使用

特性は単なるコードのコレクションであり、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();
?>
ログイン後にコピー

クラスは複数の特性を使用できます。

<?php
   trait A1{
   }
   trait A2{
   }
   class People{
     use A1,A2;
   }
?>
ログイン後にコピー

4. トレイトの使用に関する問題

a. 同時に導入された複数のトレイトに同じ名前の属性がある場合、競合が発生します。起こる。

<?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. 同時に導入した複数のトレイトに同名のメソッドが存在すると競合が発生しますが、解決策としては A3 と A4 の 2 つがあります。

<?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. 同名カバレッジの問題: クラス内に導入されたトレイトと同じ名前のメンバーが存在する場合、別の方法で処理されます:

  • 属性: 重複した名前は許可されません。つまり、クラス トレイト内と同じ名前のメンバー プロパティを定義することはできません (静的プロパティも同様です)。

  • メソッド: クラスオーバーライド特性。

d. 継承範囲の問題: クラスが trait を使用する場合、そのクラスは親クラスからも継承し、そのトレイトにはそのクラスと同じ名前のメソッドがあります。親クラスの場合、trait は親クラスと同じ名前のメソッドを上書きします。親クラスのメソッドにアクセスしたい場合は、同じ名前の trait メソッドを使用して、親クラスの同じ名前のメソッドにアクセスします。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php trait Eat{ public function eat(){ echo &amp;#39;Eat::eat&amp;#39;; } } class Human{ public function eat(){ echo &amp;#39;Human::eat&amp;#39;; } } //子类继承父类同时使用trait class Man extends Human{ use Eat; } $m = new Man(); $m-&gt;eat(); ?&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div> e.trait 自体にはアクセスできません。他のクラスにコードを再利用するためにのみ使用されます。したがって、クラスは、特性を使用するときに、より高度なアクセス制御を使用できます: in

as

Afterつまり、ターゲットのアクセス修飾子修飾子を使用します。 <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">&lt;?php trait Eat{ private function show(){ echo &amp;#39;eat&amp;#39;; } } class Human{ use Eat{ show as public eshow; //注意:as是用来设定别名的,虽然没有同名show,但是系统认为show已经存在,所以必须别名,权限的更改的方法不是 //本尊 } } $h = new Human(); $h-&gt;eshow(); //eat ?&gt;</pre><div class="contentsignin">ログイン後にコピー</div></div> f.trait では

abstract メソッド

を使用できます。使用するクラスは、対応する abstract メソッド を実装する必要があります。 using クラスは、抽象クラス、または抽象クラスのいずれかである必要があります。または、抽象メソッドを実装する必要があります。

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

   class Animal{
    use Eat;
    public function eat(){		//具体类:实现抽象方法
        echo &#39;Animal::eat&#39;;	
    }		
}
?>
ログイン後にコピー
推奨: php チュートリアル

,php ビデオ チュートリアル

以上が息を震わせながら繰り返す、いつになったら立ち上がれるのか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!