Heim  >  Artikel  >  Backend-Entwicklung  >  Analyse von Merkmalen in PHP

Analyse von Merkmalen in PHP

不言
不言Original
2018-07-07 11:55:401419Durchsuche

Dieser Artikel stellt hauptsächlich die Analyse von Traits in PHP vor, die einen gewissen Referenzwert hat. Jetzt kann ich sie mit allen teilen, die sie brauchen.

Seit PHP 5.4.0 hat PHP A Methode zur Wiederverwendung von Code, sogenannte Traits.

Trait bedeutet wörtlich „Merkmale“ und „Merkmale“. Wir können verstehen, dass die Verwendung des Schlüsselworts Trait neue Funktionen zu Klassen in PHP hinzufügen kann.

Trait ist ein Code-Wiederverwendungsmechanismus, der für Sprachen mit einfacher Vererbung wie PHP vorbereitet ist. Merkmale sollen die Einschränkungen von Sprachen mit einfacher Vererbung verringern und Entwicklern die freie Wiederverwendung von Methoden in unabhängigen Klassen innerhalb verschiedener Hierarchien ermöglichen. Die Semantik der Zusammensetzung von Merkmalen und Klassen definiert eine Möglichkeit, die Komplexität zu reduzieren und die typischen Probleme zu vermeiden, die mit herkömmlicher Mehrfachvererbung und Mixin-Klassen verbunden sind.

Trait ähnelt Class, ist jedoch nur darauf ausgelegt, Funktionalität auf feinkörnige und konsistente Weise zu kombinieren. Kann nicht durch das Merkmal selbst instanziiert werden. Es fügt der traditionellen Vererbung eine Kombination horizontaler Funktionen hinzu; das heißt, es ist keine Vererbung zwischen mehreren Klassen in einer Anwendung erforderlich.

Verwendung: Durch Verwendung des Schlüsselworts „use“ in der Klasse den zu kombinierenden Trait-Namen deklarieren. Die spezifische Trait-Deklaration kann nicht instanziiert werden.

1. Grundlagen der Eigenschaften

<?php
header("Content-type:text/html;charset=utf-8");
trait Test{public function hello1(){        
return "Test::hello1()";
    }
}class demo1{    
use Test;
}$obj = new demo1();echo $obj->hello1().&#39;<br />&#39;;//Test::hello1()

2. Priorität

<?php
class Base {    
public function sayHello() {        
echo &#39;Hello &#39;;
    }
}

trait SayWorld {    
public function sayHello() {
        parent::sayHello();        
        echo &#39;World!&#39;;
    }
}class MyHelloWorld extends Base {    
use SayWorld;
}$o = new MyHelloWorld();$o->sayHello();//Hello World!

<?php

trait HelloWorld {    
public function sayHello() {        
echo &#39;Hello World!&#39;;
    }
}class TheWorldIsNotEnough {    
use HelloWorld;    
public function sayHello() {        
echo &#39;Hello Universe!&#39;;
    }
}
$o = new TheWorldIsNotEnough();
$o->sayHello();//Hello Universe!

Von der Basisklasse geerbte Mitglieder werden von der MyHelloWorld-Methode im eingefügten SayWorld-Merkmal überschrieben. Sein Verhalten stimmt mit den in der MyHelloWorld-Klasse definierten Methoden überein. Die Rangfolge besteht darin, dass Methoden in der aktuellen Klasse Merkmalsmethoden überschreiben, die wiederum Methoden in der Basisklasse überschreiben.

3. Mehrere Merkmale

Mehrere Merkmale werden in der Verwendungsanweisung durch Kommas getrennt aufgelistet und können alle in eine Klasse eingefügt werden.

<?php

trait Hello {    
public function sayHello() {        
echo &#39;Hello &#39;.&#39;<br />&#39;;
    }
}

trait World {    
public function sayWorld() {        
echo &#39;World&#39;.&#39;<br />&#39;;
    }
}class MyHelloWorld {    
use Hello, World;    
public function sayExclamationMark() {        
echo &#39;!&#39;.&#39;<br />&#39;;
    }
}$o = new MyHelloWorld();$o->sayHello();//Hello$o->sayWorld();//World$o->sayExclamationMark();//!

4. Konfliktlösung

Wenn zwei Merkmale eine Methode mit demselben Namen einfügen, kommt es zu einem Konflikt, wenn der Konflikt nicht gelöst wird explizit Ein schwerwiegender Fehler.

Um den Namenskonflikt mehrerer Merkmale in derselben Klasse zu lösen, müssen Sie den Operator insteadof verwenden, um explizit anzugeben, welche der widersprüchlichen Methoden verwendet werden sollen.

<?php

trait A{    public function smallTalk(){        echo &#39;a&#39;;
    }    public function bigTalk(){        echo &#39;A&#39;;
    }
}

trait B{    public function smallTalk(){        echo &#39;b&#39;;
    }    public function bigTalk(){        echo &#39;B&#39;;
    }
}class Talker{    use A,B{
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
    }
}$obj = new Talker();$obj->smallTalk();//b$obj->bigTalk();//A

Mit der obigen Methode können nur andere Methoden ausgeschlossen werden. Der as-Operator kann einen Alias ​​für eine Methode einführen. Beachten Sie, dass der Operator as die Methode weder umbenennt noch deren Methoden beeinflusst.

<?php

trait A{    public function smallTalk(){        echo &#39;a&#39;;
    }    public function bigTalk(){        echo &#39;A&#39;;
    }
}

trait B{    public function smallTalk(){        echo &#39;b&#39;;
    }    public function bigTalk(){        echo &#39;B&#39;;
    }
}class Talker{    use A,B{
        B::smallTalk insteadof A;
        A::bigTalk insteadof B;
        B::bigTalk as b_bigTalk;
        A::smallTalk as a_smallTalk;
    }
}$obj = new Talker();$obj->smallTalk();//b$obj->bigTalk();//A$obj->b_bigTalk();//B$obj->a_smallTalk();//a

5. Ändern Sie die Zugriffskontrolle der Methode

Die Verwendung der as-Syntax kann auch zum Anpassen verwendet werden die Zugriffskontrolle der Methode.

<?php

trait A{    private function smallTalk(){        echo &#39;a&#39;;
    }
}class Talker{    use A{
        smallTalk as public aaa;
    }
}$obj = new Talker();$obj->aaa();//a

6. Merkmalsgruppe

So wie eine Klasse Merkmale verwenden kann, können auch andere Merkmale Merkmale verwenden. Durch die Verwendung eines oder mehrerer Merkmale beim Definieren eines Merkmals können Sie einige oder alle Mitglieder anderer Merkmale kombinieren.

<?php

trait Hello{    public function sayHello(){        echo &#39;Hello &#39;;
    }
}

trait World{    public function sayWorld(){        echo &#39;World !&#39;;
    }
}

trait HelloWorld{    use Hello,World;
}class Talker{    use HelloWorld;
}$obj = new Talker();$obj->sayHello();//Hello$obj->sayWorld();//World !

7. Abstrakte Mitglieder

Um verbindliche Anforderungen an die verwendeten Klassen zu stellen, unterstützen Merkmale die Verwendung abstrakter Methoden.

<?php

trait Hello{    public function sayWorld(){        echo &#39;Hello &#39;.$this->getWorld();
    }    abstract public function getWorld();
}class Talker{    private $world;    use Hello;    public function getWorld(){        return $this->world;
    }    public function setWorld($val){        $this->world = $val;
    }
}$obj = new Talker();$obj->setWorld("Trait !");$obj->sayWorld();//Hello Trait !

8. Eigenschaften statischer Mitglieder

Eigenschaften können durch statische Mitglieder und statische Methoden definiert werden.

<?php

trait HelloWorld{    public static function sayHelloWorld(){        echo &#39;Hello World !&#39;;
    }
}class Talker{    use HelloWorld;
}
Talker::sayHelloWorld();//Hello World !

<?php

trait Counter{    public function inc(){        static $c = 0;        $c++;        echo "$c\n";
    }
}class C1{    use Counter;
}class C2{    use Counter;
}$c1 = new C1();$c1->inc();//1$c1_1 = new C1();$c1_1->inc();//2$c2 = new C2();$c2->inc();//1

9. Attribute

Trait kann auch Attribute definieren.

<?php

trait PropertiesTrait {    public $x = 1;
}class PropertiesExample {    use PropertiesTrait;
}$example = new PropertiesExample;echo $example->x;//1

Trait Nach der Definition eines Attributs kann die Klasse keine Attribute mit demselben Namen definieren, da sonst ein schwerwiegender Fehler auftritt. Es gibt eine Ausnahme: Eigenschaften sind kompatibel (gleiche Zugriffssichtbarkeit, anfänglicher Standardwert). Wenn das Attribut vor PHP 7.0 kompatibel war, gab es eine E_STRICT-Erinnerung.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, dass er für das Studium aller hilfreich ist. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

So verwenden Sie Elasticsearch in PHP

Anleitung für den PHP-Timer

Das obige ist der detaillierte Inhalt vonAnalyse von Merkmalen in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
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