Các đặc điểm php có thể có hàm tạo không?

Khi phát triển các ứng dụng lớn hơn, Mẫu đảo ngược phụ thuộc là một công cụ quan trọng để giữ cho việc bảo trì ở mức tối thiểu và khả năng kiểm tra ở mức tối đa. Munir Hassan cho Codeproject có một bài viết tuyệt vời đề cập đến chủ đề Nguyên tắc đảo ngược phụ thuộc và Mẫu tiêm phụ thuộc

Khi chúng tôi kết hợp các mô-đun quá chặt chẽ mà không có các lớp hoặc giao diện trừu tượng, chi phí bảo trì sẽ tăng lên rất nhiều. Bài viết Codeproject ở trên đã giúp tôi tiết kiệm rất nhiều thời gian phát triển và khi tôi đọc về các đặc điểm của PHP một thời gian trước, tôi nhận ra rằng chúng có thể được sử dụng để làm cho việc này trở nên dễ dàng hơn

Vì vậy, làm thế nào để đặc điểm giúp đỡ?

Một đặc điểm là một cấu trúc giống như lớp trong PHP mà nhiều người gọi là “sao chép và dán có hỗ trợ ngôn ngữ”. Điều này có nghĩa là khi bạn nhập một đặc điểm vào một lớp, tất cả các thuộc tính và phương thức được xác định trong đặc điểm đó sẽ được sao chép/dán vào lớp của bạn. Lấy ví dụ sau

Những điều trên có vẻ ổn [ngoại trừ khả năng getConnection[] không thành công nếu nó không được đặt, chúng tôi sẽ lo lắng về điều đó vào lúc khác]. Nó sử dụng một dạng tiêm hàm tạo để đảm bảo rằng lớp Người dùng biết càng ít càng tốt về lớp Kết nối. Tuy nhiên, điều này tạo ra sự cố trong đó, giả sử, một lớp khác, Sản phẩm hiện cũng cần triển khai Kết nối, bây giờ chúng ta cũng sẽ có đoạn mã sau

Hai lớp này cũng có các phương thức và thuộc tính khác, nhưng điều quan trọng cần lưu ý ở đây là cả hai lớp này hiện sử dụng cùng một mã chính xác để thiết lập và nhận các triển khai Kết nối tương ứng của chúng. Chúng ta có thể đơn giản hóa quy trình này bằng cách tạo một đặc điểm Kết nối và áp dụng nó cho cả hai lớp của chúng ta

Hãy xem nó hoạt động

Dưới đây là đặc điểm Kết nối mà chúng ta sẽ sử dụng để tạo mã giữa tất cả các lớp cần triển khai Kết nối

Bây giờ chúng ta có thể sử dụng đặc điểm mới của mình trong cả hai lớp của mình thay vì xác định lại mã trong cả hai, chúng ta hãy xem các lớp có đặc điểm được nhập/áp dụng

Kết quả cuối cùng

Các lớp Người dùng và Sản phẩm của chúng tôi hiện nhập đặc điểm Kết nối thay vì xác định lại mã. Điều này thêm thuộc tính private $connection cũng như các phương thức setConnection[] và getConnection[] vào các lớp của chúng ta trong thời gian chạy. Giờ đây, cả hai chúng tôi đều lưu các dòng mã và đảm bảo rằng nếu Đặc điểm kết nối cần thay đổi, chúng tôi có thể dễ dàng áp dụng thay đổi này trong tất cả các lớp sử dụng nó

Bạn sẽ thấy các hàm tạo lớp hoạt động như thế nào trong PHP, điều gì xảy ra với kế thừa lớp và một tính năng mới của PHP 8 có tên là “xúc tiến đối số”

nội dung

Trình xây dựng lớp PHP là gì?

Trong lập trình hướng đối tượng, các đối tượng là các biến của một lớp cụ thể

Ví dụ


class Circle
{
   public $radius;
   public $color;
   public $thickness;
}
$myCircle = new Circle[];

Ở đây, $myCircle là một biến của lớp Circle

Khi bạn tạo một đối tượng lớp, PHP sẽ xem xét định nghĩa lớp để tìm kiếm hàm tạo của lớp

Hàm tạo của lớp là một phương thức lớp đặc biệt có tên __construct[]. Phương thức này được thực thi ngay sau khi tạo một đối tượng của lớp đó

Vì vậy, hãy thêm một hàm tạo vào lớp Circle của chúng ta


class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}

Hàm tạo của chúng tôi gán một số giá trị cho các thuộc tính của lớp

Vì hàm tạo được thực thi ngay khi một đối tượng mới được tạo, nên các giá trị này sẽ là giá trị mặc định cho mọi đối tượng mới

Bạn có thể thử và xem cho chính mình


$myCircle = new Circle[];
echo $myCircle->radius . '
'; echo $myCircle->color . '
'; echo $myCircle->thickness . '
';

Output:
5
black
1

 

Các nhà xây dựng không bị giới hạn trong việc thiết lập các thuộc tính của lớp. Họ cũng có thể gọi các phương thức lớp khác, thực thi các lệnh như tiếng vang, kết nối với cơ sở dữ liệu, v.v.

Thông thường, bạn muốn sử dụng hàm tạo để

  • Khởi tạo các thuộc tính lớp thành giá trị mặc định của chúng
  • Thực hiện kiểm tra xác thực đối số đầu vào hoặc biến toàn cục
  • Khởi tạo tài nguyên lớp, chẳng hạn như kết nối cơ sở dữ liệu và tệp nhật ký

Ví dụ: đây là cách bạn có thể tạo một lớp bao bọc cơ sở dữ liệu tùy chỉnh tự động kết nối với cơ sở dữ liệu ngay khi bạn tạo một đối tượng mới


class MyDatabase[]
{
   private $mysqli;
   
   public function __construct[$user, $passwd] {
      $this->mysqli = mysqli_connect['localhost', $user, $passwd];
   }
}

Danh sách đối số của hàm tạo

Các hàm tạo của lớp hỗ trợ các đối số giống như bất kỳ phương thức thông thường nào

Danh sách đối số của hàm tạo có thể bao gồm các đối số đã nhập, đối số có độ dài thay đổi và giá trị mặc định

Ví dụ


class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[int $radius, string $color = 'black', int $thk = 1] {
      $this->radius = $radius;
      $this->color = $color;
      $this->thickness = $thk;
   }
}

 

Khi bạn tạo một đối tượng mới, bạn phải tuân theo các yêu cầu về danh sách đối số của hàm tạo lớp

Ví dụ: bạn không thể tạo một đối tượng của lớp Circle mà không có đối số [vì đối số $radius là bắt buộc và không có giá trị mặc định] hoặc với một chuỗi làm đối số đầu tiên [vì nó phải là một kiểu int]


$myCircle = new Circle[];
/* Fatal error: Too few arguments to function Circle::__construct[] */
$myCircle = new Circle['hey'];
/* Fatal error: Argument 1 passed to Circle::__construct[] must be of the type integer */
$myCircle = new Circle[7];
/* OK! */

 

Lưu ý rằng hàm tạo của lớp không thể trả về bất kỳ giá trị nào

Lý do là các hàm tạo có nghĩa là trả về đối tượng mới, vì vậy sẽ không có ý nghĩa gì khi trả lại bất kỳ thứ gì khác

Constructor và kế thừa lớp

Bây giờ hãy xem cách các hàm tạo của lớp hoạt động với tính kế thừa của lớp

Giả sử bạn có một lớp cha và một lớp con


class Bird
{
   public $wingspan;
   
   public function __construct[int $wingspan = 1] {
      $this->wingspan = $wingspan;
   }
}
class Parrot extends Bird
{
   public $species;
   
   public function __construct[] {
      $this->species = 'Parrot';
   }
}

 

Khi bạn tạo một đối tượng của lớp con, PHP sẽ thực thi hàm tạo của lớp con. Tuy nhiên, phương thức khởi tạo của lớp cha không được thực thi tự động


$parrot = new Parrot[];
echo $parrot->species; /* Outputs "Parrot". */
echo '
'; echo $parrot->wingspan; /* Outputs nothing, because $wingspan is not set. */

 

Như đã giải thích trong hướng dẫn thừa kế PHP này, nếu bạn muốn hàm tạo của lớp cha được thực thi, thì bạn cần gọi nó một cách rõ ràng từ hàm tạo của lớp con

Như thế này


class Parrot extends Bird
{
   public $species;
   
   public function __construct[] {
      $this->species = 'Parrot';
      parent::__construct[];
   }
}

class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}
0

 

Hàm tạo của lớp con không cần có danh sách đối số tương thích với hàm tạo của lớp cha

Nói cách khác, bạn có thể đặt bất kỳ danh sách đối số nào cho hàm tạo của lớp con, bất kể hàm tạo của lớp cha lấy đối số nào.

các nhà xây dựng bị cấm. riêng tư và trừu tượng

Có hai trường hợp khi bạn không thể gọi hàm tạo của lớp

trường hợp đầu tiên. bạn không thể gọi một hàm tạo trừu tượng của một lớp trừu tượng, giống như bạn không thể gọi bất kỳ phương thức trừu tượng nào

Ví dụ


class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}
1

class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}
2

 

Nhưng bạn có thể gọi một hàm tạo không trừu tượng từ lớp cha, ngay cả khi bản thân lớp đó là trừu tượng


class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}
3

 

trường hợp thứ hai. nếu bạn đặt khả năng hiển thị của hàm tạo thành được bảo vệ hoặc riêng tư, thì bạn không thể tạo đối tượng của lớp đó


class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}
4_______6_______5

 

Bây giờ, bạn có thể tự hỏi. tại sao bạn muốn ngăn các đối tượng được tạo?

Chà, trong một số trường hợp, bạn muốn chỉ có thể tạo các đối tượng lớp từ chính lớp đó bằng cách sử dụng các phương thức tĩnh

Một trong những trường hợp như vậy là khi bạn muốn mô phỏng nhiều hàm tạo. Nếu bạn muốn biết thêm, bạn có thể tìm thêm chi tiết tại đây [trong phần Phương pháp tạo tĩnh]

Quảng cáo đối số PHP 8

PHP 8 đã giới thiệu một cách mới để tự động xác định các thuộc tính của lớp trực tiếp từ hàm tạo

Đây là ý tưởng

Đối với mỗi đối số hàm tạo, bạn có thể tự động biến đối số đó thành thuộc tính lớp bằng cách thêm công cụ sửa đổi khả năng hiển thị

Tính năng này được gọi là khuyến mãi nhà xây dựng

Ví dụ


class Circle
{
   public $radius;
   public $color;
   public $thickness;
   
   public function __construct[] {
      $this->radius = 5;
      $this->color = 'black';
      $this->thickness = 1;
   }
}
6

 

Các đối số $radius và $color có công cụ sửa đổi khả năng hiển thị công khai, do đó chúng được hàm tạo tự động chuyển thành thuộc tính lớp công khai

Bạn cũng có thể xác định các đối số được bảo vệ và riêng tư và chúng sẽ lần lượt được chuyển thành các thuộc tính được bảo vệ và riêng tư

Khi bạn sử dụng cú pháp này, bạn không cần tạo các thuộc tính một cách rõ ràng trong lớp

Mặt khác, đối số $thickness không có công cụ sửa đổi khả năng hiển thị trong danh sách đối số. Do đó, bạn cần định nghĩa nó một cách rõ ràng trong lớp

Phần kết luận

Trong hướng dẫn này, bạn đã học cách thức hoạt động của hàm tạo lớp PHP

Chúng ta đã xem xét danh sách đối số của hàm tạo, quy tắc kế thừa lớp và hai trường hợp khi bạn không thể gọi trực tiếp hàm tạo của lớp

Tôi có thể sử dụng hàm tạo trong đặc điểm không?

Bạn không thể sử dụng hàm tạo trong Trait, các đặc điểm trong php sử dụng cho nhiều kế thừa nhưng nhà thầu thuộc về lớp chứ không phải đặc điểm. Lời khuyên của tôi, dựa trên hơn một năm xử lý các đặc điểm trong PHP, là. tránh viết các hàm tạo theo các đặc điểm hoặc nếu bạn phải - ít nhất hãy đặt chúng không có tham số .

Các đặc điểm PHP có thể có thuộc tính không?

Các đặc điểm có thể chứa các phương thức [như sayHello[]] và các thuộc tính [như $name] . Các đặc điểm cũng hỗ trợ các toán tử hiển thị [công khai, được bảo vệ và riêng tư], các phương thức và thuộc tính tĩnh cũng như các toán tử lớp như cha mẹ. , bản thân. và $này. Các lớp PHP có thể sử dụng các đặc điểm và bao gồm mã của các đặc điểm đó.

Các đặc điểm PHP có thể có hằng số không?

Mặc dù các đặc điểm không được phép khai báo các hằng số, nhưng có thể truy cập các hằng số trong các lớp PHP mà các đặc điểm được sử dụng trong

Các đặc điểm được sử dụng cho PHP là gì?

Trong PHP, một đặc điểm là một cách cho phép các nhà phát triển sử dụng lại các phương thức của các lớp độc lập tồn tại trong các hệ thống phân cấp thừa kế khác nhau . Nói một cách đơn giản, các đặc điểm cho phép bạn tạo các phương thức mong muốn trong cài đặt lớp, sử dụng từ khóa đặc điểm. Sau đó, bạn có thể kế thừa lớp này thông qua từ khóa sử dụng.

Chủ Đề