Làm cách nào để ghi đè chức năng trong PHP?

Đặc điểm là một điều tuyệt vời trong PHP. Bạn có thể sử dụng chúng để giảm trùng lặp mã bằng cách đặt các chức năng phổ biến trong một đặc điểm và áp dụng chúng cho tất cả các lớp cần các chức năng đó. Đôi khi tôi cũng sử dụng các đặc điểm để chia nhỏ một chức năng lớn thành nhiều đặc điểm sử dụng một lần

Trong bài đăng này, tôi muốn chỉ cho bạn cách bạn có thể ghi đè lên một chức năng đặc điểm và gọi nó từ chức năng ghi đè

Ghi đè một chức năng đặc điểm

Hãy tạo một đặc điểm đơn giản và sử dụng nó trong một lớp học

trait MyTrait
{
   public function sayHi()
   {	
      echo 'trait says hi';
   }
}

class MyClass
{
   use MyTrait;
}

Thực thi (new MyClass)->sayHi(); sẽ xuất ra "trait say hi"

Chức năng đặc điểm có thể được ghi đè đơn giản bằng cách xác định một chức năng có cùng tên trong lớp

class MyClass
{
   use MyTrait;
   
   public function sayHi()
   {	
      echo 'class says hi';
   }
}

Bây giờ (new MyClass)->sayHi(); sẽ xuất ra "lớp nói xin chào"

Gọi triển khai đặc điểm từ bên trong chức năng bị ghi đè

Bạn có thể không cần điều này hàng ngày, nhưng đây là cách bạn có thể gọi triển khai sayHi từ trait bên trong hàm sayHi từ lớp

class MyClass
{
   use MyTrait {
      sayHi as protected sayHiFromTrait;
   }
	
   public function sayHi()
   {	
      $this->sayHiFromTrait();
		
      echo ' and class says hi';
   }
}

Bây giờ (new MyClass)->sayHi(); sẽ xuất ra "đặc điểm nói xin chào và lớp nói xin chào"

Một ví dụ mà tôi cần cái này

Tôi hiện đang làm việc trên Media Library Pro. Gói này sẽ cung cấp, bên cạnh các thành phần Vue và React, một vài thành phần hỗ trợ Livewire giúp dễ dàng tải tệp lên thư viện phương tiện

Về cơ bản, nó sẽ sử dụng khả năng tải lên của Livewire. Để sử dụng các chức năng tải lên của Livewire, bạn cần áp dụng một đặc điểm có tên là WithFileUploads. Ngoài hộp, Livewire cũng xử lý lỗi tải lên. Điều này được thực hiện bên trong hàm

class MyClass
{
   use MyTrait;
   
   public function sayHi()
   {	
      echo 'class says hi';
   }
}
0 của trait

Thành phần bộ sưu tập của media library pro có thể được sử dụng để quản lý các tệp bên trong bộ sưu tập thư viện phương tiện

Đây là cách thành phần bộ sưu tập trông như thế nào theo mặc định

Làm cách nào để ghi đè chức năng trong PHP?

Nếu bạn cố gắng thêm một tệp quá lớn vào bộ sưu tập, thông báo lỗi sẽ hiển thị ở trên cùng

Làm cách nào để ghi đè chức năng trong PHP?

Nếu bạn muốn thay thế một tệp trong bộ sưu tập, bạn có thể kéo tệp lên trên hàng. Nếu tệp không được chấp nhận, thông báo lỗi sẽ hiển thị trên hàng

Làm cách nào để ghi đè chức năng trong PHP?

Để đạt được điều này, thành phần vẫn dựa vào triển khai

class MyClass
{
   use MyTrait;
   
   public function sayHi()
   {	
      echo 'class says hi';
   }
}
0 bên trong đặc điểm WithFileUploads của Livewire. Việc triển khai sẽ thử một
class MyClass
{
   use MyTrait;
   
   public function sayHi()
   {	
      echo 'class says hi';
   }
}
3. Trong thành phần của chúng tôi, chúng tôi nắm bắt ngoại lệ đó và thực hiện logic cần thiết để hiển thị thông báo lỗi ở đúng nơi. Đây là mã có liên quan bên trong thành phần của chúng tôi

namespace Spatie\MediaLibraryPro\Http\Livewire;

use Illuminate\Validation\ValidationException;
use Livewire\Component;
use Livewire\WithFileUploads;

class LivewireUploaderComponent extends Component
{
   use WithFileUploads {
      uploadErrored as protected uploadErroredTrait;
   }
      
   // ...
   
    public function uploadErrored($name, $errorsInJson, $isMultiple)
    {
        try {
            $this->uploadErroredTrait($name, $errorsInJson, $isMultiple);
        } catch (ValidationException $exception) {
            $uploadError = $exception->validator->errors()->first();

            $this->replacingMedia()
                ? $this->emit('showItemUploadError', $this->uuid, $uploadError)
                : $this->emitUp('showListErrorMessage', $uploadError);
        }
    }
}

Bớt tư tưởng

Tôi hy vọng bạn thích lời giải thích nhỏ này về cách bạn có thể gọi các phương thức đặc điểm bị ghi đè. Để ở trong vòng lặp của thư viện phương tiện chuyên nghiệp, hãy đăng ký vào danh sách gửi thư tại medialibrary. chuyên nghiệp

Làm cách nào để ghi đè một phương thức trong PHP?

Trong ghi đè hàm, cả lớp cha và lớp con phải có cùng tên hàm và số đối số . Nó được sử dụng để thay thế phương thức cha trong lớp con. Mục đích của việc ghi đè là thay đổi hành vi của phương thức lớp cha. Hai phương thức có cùng tên và cùng tham số được gọi là ghi đè.

Chúng ta có thể ghi đè các thuộc tính trong PHP không?

Có thể ghi đè thuộc tính của lớp cha từ lớp con không? . Điều không thể thực hiện được là gọi $obj->aa(); . Yes. What is not possible is calling $obj->aa(); from $obj->bb(); because $obj->aa(); is defined in the child class.

Nạp chồng và ghi đè hàm trong PHP là gì?

Quá tải là xác định các chức năng có chữ ký tương tự, nhưng có các tham số khác nhau. Ghi đè chỉ thích hợp với các lớp dẫn xuất, trong đó lớp cha đã định nghĩa một phương thức và lớp dẫn xuất muốn ghi đè phương thức đó. Trong PHP, bạn chỉ có thể quá tải các phương thức bằng cách sử dụng phương thức ma thuật __call

Làm cách nào bạn có thể tạo một phương thức Không thể ghi đè trong PHP?

Tránh ghi đè phương thức . using the keyword final infront of the method name prevents it from being overriden.