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
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ở.
Ví dụ trên sẽ xuất ra:
Ví dụ #3 Ví dụ về thứ tự ưu tiên thay thế
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ử class
3 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ử class
4 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ử class
4 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
classezcReflectionMethod extends ReflectionMethod {
2
use ezcReflectionReturnInfo;
/* ... */
}
use ezcReflectionReturnInfo;
/* ... */
}
?>
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ử class
4 để có thể sử dụng triển khai BigTalk của B theo bí danh bổ sung class
7.
Thay đổi khả năng hiển thị phương pháp
class
0
trait
ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}class
ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
5Ví 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
classezcReflectionMethod extends ReflectionMethod {
6
use ezcReflectionReturnInfo;
/* ... */
}
use ezcReflectionReturnInfo;
/* ... */
}
?>
class
ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* ... */
}class
ezcReflectionFunction extends ReflectionFunction {
use ezcReflectionReturnInfo;
/* ... */
}
?>
8Giả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ử
class
3 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ử
class
4 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ửclass
4 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
classezcReflectionMethod extends ReflectionMethod {
9
use ezcReflectionReturnInfo;
/* ... */
}
use ezcReflectionReturnInfo;
/* ... */
}
?>
class
0classSayWorld {
1
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
classSayWorld {
2
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
trait
69 năm trước ¶
10 năm trước
classSayWorld {
4
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
classSayWorld {
5
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
classSayWorld {
6
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
classSayWorld {
7
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}class
MyHelloWorld extends Base {
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
8Greywire tại Gmail Dot Com ¶ ¶
10 năm trước
classSayWorld {
9
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
7
7class
0T8 tại At Pobox Dot Com ¶ ¶
Qeremy [!] Gmail ¶
class
1
class
2
class
3
class
4
trait
67 năm trước ¶
Qeremy [!] Gmail ¶
class
6
class
7
trait
67 năm trước ¶
Qeremy [!] Gmail ¶
class
9
TheWorldIsNotEnough {
0
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
TheWorldIsNotEnough {
1
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
classSayWorld {
7
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
TheWorldIsNotEnough {
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
37 năm trước ¶
10 năm trước
TheWorldIsNotEnough {
4
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
TheWorldIsNotEnough {
5
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
trait
6RAWSRC ¶ ¶
4 năm trước
TheWorldIsNotEnough {
7
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
TheWorldIsNotEnough {
8
use HelloWorld;
public function sayHello[] {
echo 'Hello Universe!';
}
}$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>
classSayWorld {
7
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
use
0Canufrank ¶ ¶
6 năm trước
use
1
use
2
use
3
use
4Balbuf ¶ ¶
10 năm trước
use
5
use
6
use
7
use
8marko tại newvibrations dot net ¶ ¶
6 năm trước
use
9
class
00
trait
6Balbuf ¶ ¶
marko tại newvibrations dot net ¶
class
02
class
03
class
04
class
05
class
06Edward ¶ ¶
10 năm trước
class
07
class
08
class
09
classSayWorld {
7
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
use SayWorld;
}$o = new MyHelloWorld[];
$o->sayHello[];
?>
class
11guidobelluomo tại gmail dot com ¶ ¶
2 năm trước
class
12
class
13
class
14
class
15QSchuler tại Neosyne Dot Com ¶ ¶
marko tại newvibrations dot net ¶
class
16
class
17
class
18
class
19
class
20Edward ¶ ¶
Qeremy [!] Gmail ¶
class
21
class
22
class
23
class
24
class
25
class
26
class
27
class
24
class
29
trait
67 năm trước ¶
Stefan W ¶
class
31
9 năm trước ¶
marko tại newvibrations dot net ¶
class
32
class
33
class
34
class
35
class
36
class
37
class
38
class
39
class
37
class
41
class
42
class
43
class
44
class
45
class
46
class
47
class
48
class
49
class
50
trait
6Edward ¶ ¶
Stefan W ¶
class
52
class
53
class
54
class
55
class
56
class
57
class
58
trait
6