Hướng dẫn what is trait class in php? - lớp đặc điểm trong php 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

<?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ố 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

<?php
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.

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

class

<?php
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.

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

class

<?php
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

<?php
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

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

<?php
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

<?php
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

<?php
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 {
    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 trong PHP là gì?

Đặ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.a mechanism for code reuse in single inheritance languages such as PHP. A Trait is intended to reduce some limitations of single inheritance by enabling a developer to reuse sets of methods freely in several independent classes living in different class hierarchies.

Sự khác biệt giữa một lớp và một đặc điểm trong PHP là gì?

Đặc điểm được sử dụng để khai báo các phương thức có thể được sử dụng trong nhiều lớp.Các đặc điểm có thể có các phương thức và phương thức trừu tượng có thể được sử dụng trong nhiều lớp và các phương thức có thể có bất kỳ công cụ sửa đổi truy cập nào (công khai, riêng tư hoặc được bảo vệ).. Traits can have methods and abstract methods that can be used in multiple classes, and the methods can have any access modifier (public, private, or protected).

Khi nào tôi nên sử dụng tính trạng trong PHP?

Nếu bạn muốn sử dụng lại một số mã giữa nhiều lớp, sử dụng một đặc điểm là một giải pháp thay thế để mở rộng lớp.....
Một đặc điểm có thể tiết kiệm cho bạn một số bản sao/dán thủ công bằng cách cung cấp bản sao/dán thời gian biên dịch thay thế ..

Đặc điểm có phải là từ khóa PHP không?

Định nghĩa và sử dụng Từ khóa đặc điểm được sử dụng để tạo các đặc điểm.Đặc điểm là một cách để cho phép các lớp kế thừa nhiều hành vi.The trait keyword is used to create traits. Traits are a way to allow classes to inherit multiple behaviours.