Heim  >  Artikel  >  Backend-Entwicklung  >  [php-Klassen und -Objekte]-Eigenschaft

[php-Klassen und -Objekte]-Eigenschaft

不言
不言Original
2018-04-17 15:01:161790Durchsuche


Dieser Artikel stellt die Eigenschaft [PHP-Klassen und -Objekte] vor, die einen gewissen Referenzwert hat. Jetzt können Freunde in Not darauf verweisen >Trait (PHP 5.4.0)

Übersetzungsmerkmal

    Trait ist ein Code-Wiederverwendungsmechanismus, der für Sprachen mit einfacher Vererbung wie PHP vorbereitet ist.
  • Trait Um die Einschränkungen einzelner Vererbungssprachen zu verringern, können Entwickler Methoden in unabhängigen Klassen innerhalb verschiedener Hierarchien frei wiederverwenden.
  • Trait ähnelt Class, ist jedoch nur darauf ausgelegt, Funktionalität auf feinkörnige und konsistente Weise zu kombinieren.
  • Trait fügt der traditionellen Vererbung eine Kombination horizontaler Merkmale hinzu, d. h. es ist keine Vererbung zwischen mehreren Klassen in einer Anwendung erforderlich.

Priorität

Von der Basisklasse geerbte Mitglieder werden durch von der Eigenschaft eingefügte Mitglieder überschrieben. Die Rangfolge besteht darin, dass Mitglieder der aktuellen Klasse die Methoden des Merkmals überschreiben und das Merkmal die geerbten Methoden überschreibt.

(Wenn eine Methode oder ein Attribut denselben Namen hat, überschreibt die Methode in der aktuellen Klasse die Methode des Merkmals und die Methode des Merkmals überschreibt die Methode in der Basisklasse.)


#Example #2 优先顺序示例<?phpclass Bases {
    public function sayHello() {
        echo &#39;Hello &#39;;
    }
}trait SayWorld {    public function sayHello() {
        parent::sayHello();        echo &#39;World!&#39;;
    }
}class MyHelloWorld extends Bases {
    // public function sayHello(){
    //     echo &#39;the class&#39;;
    // }
    use SayWorld;
}$o = new MyHelloWorld();$o->sayHello();    //output:   Hello World!?>
Example #3 另一个优先级顺序的例子<?phptrait 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();    //output:   Hello Universe!?>

Mehrere Merkmale

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

Example #4 多个 trait 的用法<?phptrait Hello {    public function sayHello() {
        echo &#39;Hello &#39;;
    }
}trait World {    public function sayWorld() {
        echo &#39;World&#39;;
    }
}class MyHelloWorld {
    use Hello, World;    public function sayExclamationMark() {
        echo &#39;!&#39;;
    }
}$o = new MyHelloWorld();$o->sayHello();$o->sayWorld();$o->sayExclamationMark();//output: Hello World!?>

Namenskonflikt

Wenn zwei Merkmale eine Methode mit demselben Namen einfügen, ohne den Konflikt explizit zu lösen, tritt ein schwerwiegender Fehler auf.

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

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

<?phptrait A {    public function a() {
        echo &#39;a1&#39;;
    }    public function b() {
        echo &#39;a2&#39;;
    }
}trait B {    public function a() {
        echo &#39;b1&#39;;
    }    public function b() {
        echo &#39;b2&#39;;
    }
}class C {
    use A, B {        B::a insteadof A;//insteadof 指定B类中的a方法在A类中,以解决命名冲突
        B::b insteadof A;
        A::a as a1;//把A类中的a方法取别名为a1,以解决命名冲突
        A::B as a2;
    }
}$C = new C();$C -> a();//b1$C -> b();//b2$C -> a1();//a1$C -> a2();//a2?>

Sie können auch die Zugriffskontrolle der Methode ändern

as

Example #6 修改方法的访问控制<?php
    trait Hello {        public function traitHello() {
            echo "hello,trait\n";
        }
    }    // 修改 traitHello 的访问控制
    class Class1 {
        use Hello {            traitHello as protected;
        }
    }    // 给方法一个访问控制的别名,原版 traitHello 的访问控制则没有发生变化
    class Class2 {
        use Hello {            Hello::traitHello as private hi;
        }
    }    $Obj1 = new Class1();    // $Obj1->traitHello(); # 报致命错误,因为traitHello方法被修改成受保护的
    $Obj2 = new Class2();    $Obj2->traitHello(); # 原来的traitHello方法仍然是公共的
    // $Obj2->hi();  # 报致命错误,因为别名hi方法被修改成私有的

Trait kann auch mit Trait kombiniert werden

Trait unterstützt abstrakte Methoden, statische Attribute und statische Methoden

Nachdem Trait ein Attribut definiert hat, 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.
<?phptrait Hello {    public function sayHello() {
        echo "Hello\n";
    }
}trait World {    use Hello;    public function sayWorld() {
        echo "World\n";
    }    abstract public function getWorld();
    public function inc() {
        static $c = 0;        $c = $c + 1;        echo "$c\n";
    }    public static function doSomething() {
        echo "Doing something\n";
    }
}class HelloWorld {
    use World;    public function getWorld() {
        return &#39;get World&#39;;
    }
}$Obj = new HelloWorld();$Obj->sayHello();//Hello$Obj->sayWorld();//Worldecho $Obj->getWorld() . "\n";////get WorldHelloWorld::doSomething();//Doing something$Obj->inc();//1$Obj->inc();//2

Verwandte Empfehlungen:
Example #12 解决冲突<?phptrait PropertiesTrait {    public $same = true;    public $different = false;
}class PropertiesExample {
    use PropertiesTrait;    public $same = true; // PHP 7.0.0 后没问题,之前版本是 E_STRICT 提醒
    public $different = true; // 致命错误}?>

[php-Klassen und -Objekte] Endgültiges Schlüsselwort

[php-Klassen und -Objekte] poststatisch Bindung

Typbeschränkungen für [PHP-Klassen und -Objekte]

Das obige ist der detaillierte Inhalt von[php-Klassen und -Objekte]-Eigenschaft. 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