ホームページ >バックエンド開発 >PHPチュートリアル >php5.4の新機能Traitsについて語る記事

php5.4の新機能Traitsについて語る記事

PHPz
PHPz転載
2016-07-29 09:11:131505ブラウズ

php5.4の新機能Traitsについて語る記事

Traits は、コードの再利用を実現するために 5.4 で追加された新しいメソッドです。

php は単一の継承言語ですが、Java のようなコードの再利用を実現するために 1 つのクラスで複数の基本クラスを拡張することはできません。これにより、開発者は複数の基本クラスを異なるクラスで使用できるようになります。クラス。

トレイトとクラスは、コードの複雑さを軽減し、多重継承の問題を回避するために意味的に定義されています。

トレイトはクラスに似ていますが、統一されたきめ細かい方法で一連の関数を提供するためにのみ使用されます。トレイト内でインスタンス化することはできません。つまり、クラスのようなコンストラクター __construct() はありません。トレイトは PHP の従来の継承の拡張機能として機能し、水平統合を実装するため、アプリケーション クラスでは継承が必要なくなります。

1) 使い方

クラス内のトレイトを参照するには、キーワード「use」を使用します。複数の特性は「,」で区切られます。

コード例は次のとおりです:

e1b5a59d59df21b94de83e7d48c88142

2) 優先度

基本クラスのメンバー関数は Traits の関数によってオーバーライドされ、現在のクラスのメンバー関数はその関数をオーバーライドします。特性で。

15347c240225d20be6c2913eb1e79b0esayHello();
$oe = new MyHelloWorldExt();
$oe->sayHello();
echo "\n";
$oe->shortArray();

出力:

Hello World!
A
first

3) 複数の特性

複数の特性をクラスの宣言に追加でき、複数の特性は「,」で区切られます。

bdfba6f17fb06038fe47fdb17e984b04sayHello();
$o->sayWorld();
?>

出力結果:

Hello World

4) Multiple Traits Conflict

同じクラスに追加された 2 つのトレイトが同じ関数名を持ち、明示的に処理されなかった場合、エラーが生成されます。
同じクラス内の Tratis 内の同じ名前を持つ 2 つの関数間の競合を解決するには、replaceof 演算子を使用して正しい関数を選択する必要があります。
メソッドの一意性と排他性により、内部競合を解決するために競合する関数の後に「as」演算子を使用することが許可されています。

d226c6d9b703fd0dd93c435850c040af

上記の例では、Talker はトレイト A とトレイト B を使用しているため、両方の同じ関数名の間に競合が発生します。

alker は、smallTalk がトレイト B から取得され、bigTalk がトレイト A から取得されると定義します。
Aliased_Talker は、as 演算子を使用して、トレイト B の bigTalk がエイリアス トークを通じて確実に実装されるようにします。

5) 関数のアクセス権限を変更する

Traits内の関数のアクセス権限属性を変更する構文として使用できます。

8a6071f19de93f9571c5c8de3cd1ea60

6) 特性は新しい特性を形成します

多くのクラスと同様に、特性はクラスで使用でき、特性は特性で使用できます。 1 つのトレイトには 1 つ以上のトレイトを定義でき、これらのトレイトは他のトレイトの一部またはすべてのメンバーとして定義できます。

8c6879b3e81ef0b1542a4ebf1b1e835csayHello();
$o->sayWorld();
?>

上記のルーチンは出力します:

Hello World!

7) 抽象特性メンバー

クラス内の特定のメソッドを強制するために、特性で抽象メソッドを使用できます。

例:

2d35b3ed4fa448adcdc6ec6336718c0egetWorld();
    }
    abstract public function getWorld();
}

class MyHelloWorld {
    private $world;
    use Hello;
	public function __construct($world) {
		$this->world = $world;
	}
    public function getWorld() {
        return $this->world;
    }
}

/**
 * 这里用到了5.4新功能 类实例化解引用操作
 * (new class())->method();
 */
(new MyHelloWorld('Arvin'))->sayHelloWorld();
?>

この出力例:

Hello Arvin

8) 静的特性メンバー

静的静的変数は特性では定義できませんが、Tratis 関数では定義できます。 Tratis では静的関数も定義できます。

8dcf9928cd8bc7182d3bf0f85993f242inc(); // echo 1
C1::doSomething();
?>
输出为:
1
Doing something

9) トレイトは属性を定義します

トレイトで属性が定義されている場合、そのクラスで定義されている属性が同じ属性を持つ場合、そのトレイトを参照するクラスに同じ名前の属性を定義することはできません。特性で定義された属性と同じ名前とアクセスの可視性、E_STRICT ヒント、そうでない場合は構文エラーがスローされます。

<?php
trait PropertiesTrait {
    public $x = 1;
	public $y = 2;
}

class PropertiesExample {
    use PropertiesTrait;
	public $x = 1;
	//public $y = 3;
}

$example = new PropertiesExample;
echo $example->x, $example->y;
?>

出力:

12

php5.4.0の新機能のいくつかを最後に変更ログに掲載します:

Added short array syntax support ([1,2,3]), see UPGRADING guide for full details.
Added binary numbers format (0b001010).
Added support for Class::{expr}() syntax.
Added support for Traits.//本文的主要内容
Added closure $this support back.
Added array dereferencing support.//数组解引用支持,上文中有实例
Added callable typehint.
Added indirect method call through array. #47160.
Added DTrace support.//传说DTrace是一个性能分析工具,可以跟踪出函数调用点,返回点等数据
Added class member access on instantiation (e.g. (new foo)->bar()) support.//类新实例解引用操作,上文中有实例

この記事は他の人に興味を持ってもらうことを目的としており、皆さんが引き続きphp5の新機能を探索してくれることを願っています。 4. ^_^

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。