PHP thực hiện một cách để tái sử dụng mã gọi là đặc điểm.
Đặc điểm là một cơ chế để tái sử dụng mã trong các ngôn ngữ kế thừa duy nhất như PHP. Một đặc điểm nhằm giảm một số hạn chế của việc thừa kế bằng cách cho phép nhà phát triển sử dụng lại các bộ phương thức một cách tự do trong một số lớp độc lập sống trong các phân cấp lớp khác nhau. Các ngữ nghĩa của sự kết hợp của các đặc điểm và các lớp được định nghĩa theo cách làm giảm độ phức tạp và tránh các vấn đề điển hình liên quan đến nhiều kế thừa và mixin.
Một đặc điểm tương tự như một lớp, nhưng chỉ nhằm mục đích nhóm chức năng theo cách hạt mịn và nhất quán. Không thể tự mình khởi tạo một đặc điểm. Nó là một bổ sung cho sự kế thừa truyền thống và cho phép thành phần hành vi ngang; Đó là, việc áp dụng các thành viên trong lớp mà không cần phải thừa kế.
Ví dụ số 1 ví dụ đặc điểm
<?php
trait ezcReflectionReturnInfo {
function getReturnType() { /*1*/ }
function getReturnDescription() { /*2*/ }
}
class
ezcReflectionMethod extends ReflectionMethod {use ezcReflectionReturnInfo;
/* ... */
}
class
ezcReflectionFunction extends ReflectionFunction {use ezcReflectionReturnInfo;
/* ... */
}
?>
Quyền ưu tiên
Một thành viên được thừa hưởng từ một lớp cơ sở bị ghi đè bởi một thành viên được chèn bởi một đặc điểm. Thứ tự ưu tiên là các thành viên từ các phương thức ghi đè lớp hiện tại, lần lượt ghi đè các phương thức kế thừa.
Ví dụ #2 Ví dụ về thứ tự ưu tiên
Một phương thức được kế thừa từ một lớp cơ sở được ghi đè bởi phương thức được chèn vào MyHelloworld từ đặc điểm Sayworld. Hành vi là giống nhau đối với các phương thức được xác định trong lớp MyHelloworld. Thứ tự ưu tiên là các phương thức từ các phương thức ghi đè lớp hiện tại, lần lượt ghi đè các phương thức từ lớp cơ sở.
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}
trait
SayWorld {public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class
MyHelloWorld extends Base {use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
Ví dụ trên sẽ xuất ra:
Ví dụ #3 Ví dụ về thứ tự ưu tiên thay thế
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}
class
________số 8Ví dụ trên sẽ xuất ra:
Ví dụ #3 Ví dụ về thứ tự ưu tiên thay thế
________số 8
Nhiều đặc điểm
class0
trait
class2Ví dụ trên sẽ xuất ra:
Ví dụ #3 Ví dụ về thứ tự ưu tiên thay thế
________số 8
Nhiều đặc điểm
Nhiều đặc điểm có thể được chèn vào một lớp bằng cách liệt kê chúng trong câu lệnh use, được phân tách bằng dấu phẩy.
Ví dụ #4 Cách sử dụng nhiều đặc điểm
Giải quyết xung đột
Nếu hai đặc điểm chèn một phương thức có cùng tên, một lỗi gây tử vong được tạo ra, nếu xung đột không được giải quyết rõ ràng.
class8
trait
ezcReflectionMethod extends ReflectionMethod {use ezcReflectionReturnInfo;
/* ... */
}
class
ezcReflectionFunction extends ReflectionFunction {use ezcReflectionReturnInfo;
/* ... */
}
?> 0
Để giải quyết xung đột đặt tên giữa các đặc điểm được sử dụng trong cùng một lớp, toán tử class3 cần được sử dụng để chọn chính xác một trong các phương pháp mâu thuẫn.
Vì điều này chỉ cho phép người ta loại trừ các phương thức, toán tử class4 có thể được sử dụng để thêm bí danh vào một trong các phương thức. Lưu ý toán tử class4 không đổi tên phương thức và nó cũng không ảnh hưởng đến bất kỳ phương thức nào khác.
Ví dụ #5 Giải quyết xung đột
ezcReflectionMethod extends ReflectionMethod { class
use ezcReflectionReturnInfo;
/* ... */
}
use ezcReflectionReturnInfo;
/* ... */
}
?>
2
Trong ví dụ này, người nói chuyện sử dụng các đặc điểm A và B. Vì A và B có các phương pháp mâu thuẫn, nó xác định để sử dụng biến thể của SmallTalk từ Đặc điểm B và biến thể của BigTalk từ Đặc điểm A.
Bí danh_Talker sử dụng toán tử class4 để có thể sử dụng triển khai BigTalk của B theo bí danh bổ sung class7.
Thay đổi khả năng hiển thị phương pháp
class0
trait
ezcReflectionMethod extends ReflectionMethod {use ezcReflectionReturnInfo;
/* ... */
}
class
ezcReflectionFunction extends ReflectionFunction {use ezcReflectionReturnInfo;
/* ... */
}
?> 5
Ví dụ trên sẽ xuất ra:
Ví dụ #3 Ví dụ về thứ tự ưu tiên thay thế
________số 8
Nhiều đặc điểm
Nhiều đặc điểm có thể được chèn vào một lớp bằng cách liệt kê chúng trong câu lệnh use, được phân tách bằng dấu phẩy.
Ví dụ #4 Cách sử dụng nhiều đặc điểm
ezcReflectionMethod extends ReflectionMethod { class
use ezcReflectionReturnInfo;
/* ... */
}
use ezcReflectionReturnInfo;
/* ... */
}
?>
6
class
ezcReflectionMethod extends ReflectionMethod {use ezcReflectionReturnInfo;
/* ... */
}
class
ezcReflectionFunction extends ReflectionFunction {use ezcReflectionReturnInfo;
/* ... */
}
?> 8
Giải quyết xung đột
Nếu hai đặc điểm chèn một phương thức có cùng tên, một lỗi gây tử vong được tạo ra, nếu xung đột không được giải quyết rõ ràng.
Để giải quyết xung đột đặt tên giữa các đặc điểm được sử dụng trong cùng một lớp, toán tử class3 cần được sử dụng để chọn chính xác một trong các phương pháp mâu thuẫn.:
Vì điều này chỉ cho phép người ta loại trừ các phương thức, toán tử class4 có thể được sử dụng để thêm bí danh vào một trong các phương thức. Lưu ý toán tử class4 không đổi tên phương thức và nó cũng không ảnh hưởng đến bất kỳ phương thức nào khác.
Ví dụ #5 Giải quyết xung đột
ezcReflectionMethod extends ReflectionMethod { class
use ezcReflectionReturnInfo;
/* ... */
}
use ezcReflectionReturnInfo;
/* ... */
}
?> 9
class
<?phpclass Base {
public function sayHello() {
echo 'Hello ';
}
}1
Trong ví dụ này, người nói chuyện sử dụng các đặc điểm A và B. Vì A và B có các phương pháp mâu thuẫn, nó xác định để sử dụng biến thể của SmallTalk từ Đặc điểm B và biến thể của BigTalk từ Đặc điểm A.
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}2
class
<?phpclass Base {
public function sayHello() {
echo 'Hello ';
}
}4
Bí danh_Talker sử dụng toán tử class4 để có thể sử dụng triển khai BigTalk của B theo bí danh bổ sung class7.
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}5
class
<?phpclass Base {
public function sayHello() {
echo 'Hello ';
}
}7
Thay đổi khả năng hiển thị phương pháp
Sử dụng cú pháp class4, người ta cũng có thể điều chỉnh khả năng hiển thị của phương pháp trong lớp triển lãm.
Ví dụ #6 Thay đổi khả năng hiển thị phương pháp
<?php
class Base {
public function sayHello() {
echo 'Hello ';
}
}8
class
trait0Những đặc điểm sáng tác từ các đặc điểm
Giống như các lớp có thể sử dụng các đặc điểm, các đặc điểm khác cũng vậy. Bằng cách sử dụng một hoặc nhiều đặc điểm trong một định nghĩa đặc điểm, nó có thể được cấu tạo một phần hoặc hoàn toàn các thành viên được xác định trong các đặc điểm khác.
trait1
class
trait3Safak Ozpinar / Safakozpinar tại Gmail ¶ ¶
10 năm trước
trait4
trait5
trait6Greywire tại Gmail Dot Com ¶ ¶
10 năm trước
trait7
trait8
trait6Greywire tại Gmail Dot Com ¶ ¶
Stefan W ¶
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
0
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
1
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
2
9 năm trước ¶
10 năm trước
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
4
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
5
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
6
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
7
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
class
MyHelloWorld extends Base {use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?> 8
Greywire tại Gmail Dot Com ¶ ¶
10 năm trước
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
9
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}0
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}1
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
7
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}3
Greywire tại Gmail Dot Com ¶ ¶
Stefan W ¶
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}4
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}5
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}6
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}7
9 năm trước ¶
Chris Dot Rutledge tại Gmail Dot Com ¶
<?php
trait HelloWorld {
public function sayHello() {
echo 'Hello World!';
}
}8
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
7
T8 tại At Pobox Dot Com ¶ ¶
Qeremy (!) Gmail ¶
class1
class2
class3
class4
trait67 năm trước ¶
Qeremy (!) Gmail ¶
class6
class7
trait67 năm trước ¶
Qeremy (!) Gmail ¶
class9
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
0
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
1
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
7
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?> 3
7 năm trước ¶
10 năm trước
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
4
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
5
RAWSRC ¶ ¶
4 năm trước
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
7
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello() {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough();
$o->sayHello();
?>
8
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
7
Canufrank ¶ ¶
6 năm trước
use1
use2
use3
use4Balbuf ¶ ¶
10 năm trước
use5
use6
use7
use8marko tại newvibrations dot net ¶ ¶
6 năm trước
use9
class00
trait6Balbuf ¶ ¶
marko tại newvibrations dot net ¶
class02
class03
class04
class05
class06Edward ¶ ¶
10 năm trước
class07
class08
class09
SayWorld { class
public function sayHello() {
parent::sayHello();
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld();
$o->sayHello();
?>
7
guidobelluomo tại gmail dot com ¶ ¶
2 năm trước
class12
class13
class14
class15QSchuler tại Neosyne Dot Com ¶ ¶
marko tại newvibrations dot net ¶
class16
class17
class18
class19
class20Edward ¶ ¶
Qeremy (!) Gmail ¶
class21
class22
class23
class24
class25
class26
class27
class24
class29
trait67 năm trước ¶
Stefan W ¶
class31
9 năm trước ¶
marko tại newvibrations dot net ¶
class32
class33
class34
class35
class36
class37
class38
class39
class37
class41
class42
class43
class44
class45
class46
class47
class48
class49
class50
trait6Edward ¶ ¶
Stefan W ¶
class52
class53
class54
class55
class56
class57
class58
trait6