Hướng dẫn what is traits in php oops? - những đặc điểm trong php oops là gì?

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

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ở.

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ế

trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}

class

________số 8

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

class0

trait

class2

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

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 {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}

class

ezcReflectionFunction extends ReflectionFunction {
    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 {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}

class

ezcReflectionFunction extends ReflectionFunction {
    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 {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}

class

ezcReflectionFunction extends ReflectionFunction {
    use 
ezcReflectionReturnInfo;
    
/* ... */
}
?>
9

class

class 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.

class Base {
    public function 
sayHello() {
        echo 
'Hello ';
    }
}
2

class

class 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.

class Base {
    public function 
sayHello() {
        echo 
'Hello ';
    }
}
5

class

class 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

class Base {
    public function 
sayHello() {
        echo 
'Hello ';
    }
}
8

class

trait0

Nhữ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

trait3

Safak Ozpinar / Safakozpinar tại Gmail ¶

10 năm trước

trait4

trait5

trait6

Greywire tại Gmail Dot Com ¶

10 năm trước

trait7

trait8

trait6

Greywire tại Gmail Dot Com ¶

Stefan W ¶

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
0

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
1

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
2

trait6

9 năm trước

10 năm trước

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
4

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
5

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
6

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
7

SayWorld {
    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 {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
9

trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}
0

trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}
1

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    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 ¶

trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}
4

trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}
5

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 ¶

trait HelloWorld {
    public function 
sayHello() {
        echo 
'Hello World!';
    }
}
8

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
7

class0

T8 tại At Pobox Dot Com ¶

Qeremy (!) Gmail ¶

class1

class2

class3

class4

trait6

7 năm trước

Qeremy (!) Gmail ¶

class6

class7

trait6

7 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 {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
7

TheWorldIsNotEnough {
    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

trait6

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 {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
7

use0

Canufrank ¶

6 năm trước

use1

use2

use3

use4

Balbuf ¶

10 năm trước

use5

use6

use7

use8

marko tại newvibrations dot net ¶

6 năm trước

use9

class00

trait6

Balbuf ¶

marko tại newvibrations dot net ¶

class02

class03

class04

class05

class06

Edward ¶

10 năm trước

class07

class08

class09

SayWorld {
    public function 
sayHello() {
        
parent::sayHello();
        echo 
'World!';
    }
}

class

MyHelloWorld extends Base {
    use 
SayWorld;
}
$o = new MyHelloWorld();
$o->sayHello();
?>
7

class11

guidobelluomo tại gmail dot com ¶

2 năm trước

class12

class13

class14

class15

QSchuler tại Neosyne Dot Com ¶

marko tại newvibrations dot net ¶

class16

class17

class18

class19

class20

Edward ¶

Qeremy (!) Gmail ¶

class21

class22

class23

class24

class25

class26

class27

class24

class29

trait6

7 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

trait6

Edward ¶

Stefan W ¶

class52

class53

class54

class55

class56

class57

class58

trait6

Đặc điểm là gì?

Trong lập trình máy tính, một đặc điểm là một khái niệm được sử dụng trong lập trình hướng đối tượng đại diện cho một tập hợp các phương thức có thể được sử dụng để mở rộng chức năng của một lớp.a concept used in object-oriented programming which represents a set of methods that can be used to extend the functionality of a class.

Làm thế nào để bạn đặt tên cho một đặc điểm trong PHP?

Các quy ước đặt tên cho mã được phát hành bởi các giao diện PHP Fig¶ phải được hậu tố bởi giao diện: ví dụ: PSR \ foo \ Barinterface. Các lớp trừu tượng phải được tiền tố bởi Tóm tắt: ví dụ: PSR \ foo \ Tóm tắt. Đặc điểm phải được hậu tố bởi đặc điểm: ví dụ: Psr \ foo \ bartrait. PSR-1, 4 và 12 phải được theo dõi.Traits MUST be suffixed by Trait : e.g. Psr\Foo\BarTrait . PSR-1, 4, and 12 MUST be followed.

Sự khác biệt giữa tính trạng và giao diện trong PHP là gì?

Một đặc điểm cũng tương tự như một giao diện.Sự khác biệt là giao diện không cung cấp định nghĩa về phương thức bên trong nó, phải được thực hiện bằng cách thực hiện lớp.Tuy nhiên, phương thức đặc điểm cung cấp định nghĩa, có thể hoặc không thể bị ghi đè bởi lớp sử dụng đặc điểm.

Khi nào bạn có thể sử dụng các đặc điểm?

Đặc điểm được sử dụng để chia sẻ giao diện và trường giữa các lớp.Chúng tương tự như giao diện của Java 8.Các lớp và đối tượng có thể mở rộng các đặc điểm, nhưng các đặc điểm không thể được khởi tạo và do đó không có tham số.to share interfaces and fields between classes. They are similar to Java 8's interfaces. Classes and objects can extend traits, but traits cannot be instantiated and therefore have no parameters.