php多個trait衝突解決,php中trait

本文目錄一覽:

php5.4中引入的trait能解決什麼問題

Trait 是為類似 PHP 的單繼承語言而準備的一種代碼復用機制。Trait 為了減少單繼承語言的限制,使開發人員能夠自由地在不同層次結構內獨立的類中復用 method。Trait 和 Class 組合的語義定義了一種減少複雜性的方式,避免傳統多繼承和 Mixin 類相關典型問題。所以說Trait 和 Class 相似,但僅僅旨在用細粒度和一致的方式來組合功能。 無法通過 trait 自身來實例化。它為傳統繼承增加了水平特性的組合;也就是說,應用的幾個 Class 之間不需要繼承。

php中trait 多繼承 成員屬性一樣怎麼代替

class myClass{

use myTrait;

}

$obj = new myClass();

$obj-traitMethod1();

$obj-traitMethod2();

// ↓↓ 只能調用public的屬性和方法; protected以及private只供在traits內部自己調用;

echo $obj-traitPublic;

優先級問題

Trait會覆蓋繼承的方法,當前類會覆蓋Trait方法。即 繼承的方法 Traits方法 當前類方法,

trait A{

public $var1 = ‘test’;

public function test()

{

echo ‘A::test()’;

}

public function test1()

{

php中的類是單繼承,那要有多個類繼承怎麼辦?

PHP沒有多繼承的特性。即使是一門支持多繼承的編程語言,我們也很少會使用這個特性。在大多數人看來,多繼承不是一種好的設計方法。想要給某個類添加額外的特性,不一定要使用繼承。這裡我提供一種模擬多繼承的方法以供參考。

PHP有一個魔術方法,叫做__call。當你調用一個不存在的方法時,這個方法會被自動調用。這時,我們就有機會將調用重定向到一個存在的方法。繼承多個父類的子類,尋找方法的過程一般是這樣的:

本身的方法 – 父類1的方法 – 父類2的方法…

模擬過程大致是這樣:將各個父類實例化,然後作為子類的屬性。這些父類提供一些公有的方法。當子類擁有某方法時,__call()函數不會被調用。這相當於“覆蓋”了父類的方法。當調用了不存在的方法時,通過__call()方法依次從父類中尋找可以調用的方法。雖然這不是完備的多繼承,但可以幫助我們解決問題。

?php

class Parent1 {

    function method1() {}

    function method2() {}

}

class Parent2 {

    function method3() {}

    function method4() {}

}

class Child {

    protected $_parents = array();

    public function Child(array $parents=array()) {

        $_parents = $parents;

    }

    

    public function __call($method, $args) {

        // 從“父類”中查找方法

        foreach ($this-_parents as $p) {

            if (is_callable(array($p, $method))) {

                return call_user_func_array(array($p, $method), $args);

            }

        }

        // 恢復默認的行為,會引發一個方法不存在的致命錯誤

        return call_user_func_array(array($this, $method), $args);

    }

}

$obj = new Child(array(new Parent1(), new Parent2()));

$obj-method1();

$obj-method3();

這裡沒有涉及屬性的繼承,但實現起來並不困難。可以通過__set()和__get()魔術方法來模擬屬性的繼承。請你動手實踐。

php中應用trait為什麼報錯

trait:

類似小插件,可以用use放在類中間,讓trait裡面定義的方法作為class的一部分,本身不能直接實例化。

interface:

裡面的方法都是虛擬的,需要在繼承的時候對這些方法進行重定義,也就是說,方法是說明性質的,並沒有實際操作,而你在繼承的時候,需要對方法進行function,不然就會出錯,而且不能缺失。

用法:

trait:你當成床上的小件套,比如抱枕,你可以在床上使用,也可以拿到椅子上使用,很方便的。

interface經常作為架構的時候,對一個實例的所擁有的屬性和方法進行抽象定義,簡單來講類似一個協議,老闆下達的任務。你要繼承的話,必須滿足這個協議,也就是完成老闆下達的任務,老闆只是說要做什麼。

點擊文檔鏈接,可查看更多信息

php 5.4 的 trait 怎麼用在3.2.2中

感覺 php 5.4 的 trait 和 java 的 interface 非常像!很好的代碼復用機制。但是不知道怎麼在 ThinkPHP 3.2.2 或者 OneThink 中使用。。。應該要加命名空間吧,那如何加載呢?放Common模塊下?

原創文章,作者:UCYX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/134664.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
UCYX的頭像UCYX
上一篇 2024-10-04 00:07
下一篇 2024-10-04 00:07

相關推薦

發表回復

登錄後才能評論