Bài tập php oop

Các đặc điểm là một cơ chế để tái sử dụng mã trong các ngôn ngữ kế thừa đơn lẻ như PHP. Một Đặc điểm nhằm giảm bớt một số hạn chế của thừa kế đơn lẻ 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 hệ thống phân cấp lớp khác nhau. Ngữ nghĩa của sự kết hợp giữa Đặc điểm và lớp được xác định 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 đa kế thừa và Mixins

Một Đặc điểm tương tự như một lớp, nhưng chỉ nhằm mục đích nhóm các chức năng theo cách chi tiết và nhất quán. Không thể tự 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 cấu thành hành vi theo chiều ngang;

Ví dụ #1 Ví dụ về đặ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

Thành viên kế thừa từ lớp cơ sở bị ghi đè bởi thành viên được chèn bởi Trait. Thứ tự ưu tiên là các thành viên từ các phương thức Trait của lớp hiện tại sẽ ghi đè lên các phương thức kế thừa

Ví dụ #2 Ví dụ về thứ tự ưu tiên

Phương thức kế thừa từ lớp cơ sở bị ghi đè bởi phương thức được chèn vào MyHelloWorld từ SayWorld Trait. Hành vi này giống với các phương thức được định nghĩa trong lớp MyHelloWorld. Thứ tự ưu tiên là các phương thức từ lớp hiện tại ghi đè lên các phương thức Trait, từ đó ghi đè lên 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!';
}
}

________số 8_______

$o = new TheWorldIsNotEnough[];
$o->sayHello[];
?>

Ví dụ trên sẽ xuất ra

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 class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
0, được phân tách bằng dấu phẩy

Ví dụ #4 Sử dụng nhiều đặc điểm

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
1

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
2

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
3

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
4

Ví dụ trên sẽ xuất ra

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, thì sẽ xảy ra lỗi nghiêm trọng 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 ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
5 cần được sử dụng để chọn chính xác một trong các phương thức xung đột

Vì điều này chỉ cho phép một phương thức loại trừ, toán tử class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
6 có thể được sử dụng để thêm bí danh cho một trong các phương thức. Lưu ý toán tử class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
6 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

Trong ví dụ này, Talker sử dụng các đặc điểm A và B. Vì A và B có các phương thức xung đột nê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

Aliased_Talker sử dụng toán tử class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
6 để có thể sử dụng triển khai bigTalk của B dưới một bí danh bổ sung class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
9

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

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

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

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

Thay đổi phương thức hiển thị

Sử dụng cú pháp class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
6, người ta cũng có thể điều chỉnh mức độ hiển thị của phương thức trong lớp trưng bày

Ví dụ #6 Thay đổi phương thức hiển thị

trait HelloWorld {
public function sayHello[] {
echo 'Hello World!';
}
}

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

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

Đặc điểm tổng hợp từ đặ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ể bao gồm một phần hoặc toàn bộ các thành viên được xác định trong các đặc điểm khác đó

Ví dụ #7 Các đặc điểm được tổng hợp từ các đặc điểm

class ezcReflectionMethod extends ReflectionMethod {
use ezcReflectionReturnInfo;
/* .. */
}
1

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

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
0

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
1

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
2

Ví dụ trên sẽ xuất ra

Thành viên đặc điểm trừu tượng

Các đặc điểm hỗ trợ việc sử dụng các phương thức trừu tượng để áp đặt các yêu cầu đối với lớp trưng bày. Các phương thức công khai, được bảo vệ và riêng tư được hỗ trợ. Trước PHP 8. 0. 0, chỉ các phương thức trừu tượng công khai và được bảo vệ mới được hỗ trợ

thận trọng

Một lớp cụ thể đáp ứng yêu cầu này bằng cách định nghĩa một phương thức cụ thể có cùng tên;

Ví dụ #8 Thể hiện Yêu cầu bằng Phương thức Trừu tượng

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
3

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
4

Thành viên đặc điểm tĩnh

Các đặc điểm có thể xác định các biến tĩnh, phương thức tĩnh và thuộc tính tĩnh

Ghi chú

Kể từ PHP 8. 1. 0, việc gọi một phương thức tĩnh hoặc truy cập trực tiếp vào một thuộc tính tĩnh trên một đặc điểm không được dùng nữa. Các phương thức và thuộc tính tĩnh chỉ nên được truy cập trên một lớp bằng cách sử dụng đặc điểm

Ví dụ #9 Biến tĩnh

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
5

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
6

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
7

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
8

Ví dụ #10 Phương thức tĩnh

class Base {
public function sayHello[] {
echo 'Hello ';
}
}
9

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
0

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
1

Ví dụ #11 Thuộc tính tĩnh

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
2

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
0

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
4

Của cải

Các đặc điểm cũng có thể xác định các thuộc tính

Ví dụ #12 Xác định thuộc tính

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
5

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
6

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
7

Nếu một đặc điểm xác định một thuộc tính thì một lớp không thể định nghĩa một thuộc tính có cùng tên trừ khi nó tương thích [cùng khả năng hiển thị và loại, công cụ sửa đổi chỉ đọc và giá trị ban đầu], nếu không sẽ xảy ra lỗi nghiêm trọng

Ví dụ #13 Giải quyết xung đột

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
8

trait SayWorld {
public function sayHello[] {
parent::sayHello[];
echo 'World!';
}
}
9

hằng số

Các đặc điểm có thể, kể từ PHP 8. 2. 0, cũng xác định hằng số

Ví dụ #14 Xác định hằng số

class MyHelloWorld extends Base {
use SayWorld;
}
0

class MyHelloWorld extends Base {
use SayWorld;
}
1

class MyHelloWorld extends Base {
use SayWorld;
}
2

Nếu một đặc điểm xác định một hằng số thì một lớp không thể định nghĩa một hằng số có cùng tên trừ khi nó tương thích [cùng khả năng hiển thị, giá trị ban đầu và tính hữu hạn], nếu không sẽ xảy ra lỗi nghiêm trọng

Chủ Đề