Xin chào những bạn, trong quá trình mới học PHP, có lẽ rằng nhiều các bạn cũng gặp mặt khó khăn trong vấn đề phân biệt $this và self vào PHP cùng mình cũng không phải là nước ngoài lệ. Vậy cho nên hãy cùng tìm hiểu ở bài bác này nhé.
Bạn đang xem: Phương thức tĩnh (static method) trong php
$this vs self trong đối tượng
Các chúng ta theo dõi lấy ví dụ như sau đây của bản thân mình (làm thuộc thì càng giỏi nha hề hề).
Tạo một class DoAn cùng class Pho kế thừa và override phương thức classType() của class DoAn.Xem thêm: Hướng Dẫn Chi Tiết Cách Tải Và Sử Dụng Phần Mềm Lightworks Đơn Giản
class DoAn public function classType() echo "Đây là DoAn"; public function echoClass() self::classType(); class Pho extends DoAn public function classType() echo "Đây là Pho"; $pho = new Pho(); $pho->echoClass(); // công dụng là Đây là DoAnTrong đoạn code trên, vào hàm echoClass bản thân sử dụng self::classType() nên công dụng sẽ trả về “Đây là DoAn” của lớp DoAn bởi vì phương thức echoClass() được khai báo làm việc class DoAn, cùng khi mình cụ self bằng $this thì:
class DoAn public function classType() echo "Đây là DoAn"; public function echoClass() $this->classType(); class Pho extends DoAn public function classType() echo "Đây là Pho"; $pho = new Pho();$pho->echoClass(); // công dụng là Đây là PhoKết quả hôm nay sẽ là “Đây là Pho” vị $this tham chiếu đến những thành viên của đối tượng người tiêu dùng hiện tại Pho chứ chưa hẳn là lớp DoAn. Tại phía trên thì bằng hữu mình tất cả những kết luận là:
*self đang tham chiếu mang đến class khai báo nó, $this đã tham chiếu đến đối tượng người dùng hiện tại. *self có thể gọi những phương thức không phải là tĩnh (non-static).
$this cùng self trong cách làm tĩnh
Mình đang tới ví dụ tiếp theo sau nha
class DoAn public static $type; public static function echoClass() $this->type = "Do An"; $doan = new DoAn();$doan->echoClass(); // lỗi Fatal error: Uncaught Error: Using $this when not in object context in...Xuất hiện nay lỗi này khi họ sử dụng $this trong static function. Static function rất có thể gọi thẳng từ class mà không phải tạo đối tượng:
DoAn::echoClass();Nếu dùng theo cách này thì việc dùng $this là vô nghĩa, bởi $this dùng làm tham chiếu đến đối tượng người tiêu dùng hiện trên mà bọn họ lại không thao tác làm việc với đối tượng người tiêu dùng nào cơ hội này. Bây giờ mình sẽ nạm $this bằng self:
class DoAn public static $type; public static function echoClass() echo self::$type = "Do An"; $doan = new DoAn();$doan->echoClass(); // vày AnDoAn::echoClass(); // vì AnKết trái của đoạn code cơ lại chạy được như bình thường khi cách tiến hành echoClass() được hotline bằng cả hai cách. Nếu như mình vắt static $type lịch sự $type thì đoạn code vẫn lỗi Fatal error: Access khổng lồ undeclared static property.. Vì là những thành phần non-static ko được truy vấn vào trong một static function. Chúng ta lại có những tóm lại tiếp theo là:
*$thís chẳng thể sử dụng trong số phương thức tĩnh.
$this với self khi truy vấn phương thức tĩnh với thuộc tính tĩnh
Đầu tiên bọn họ cùng xem xem liệu $this cùng self hoàn toàn có thể gọi những phương thức tĩnh hay là không nha. Mình gồm 2 lấy ví dụ như sau, trước tiên sử dụng self:
class DoAn public static function echoClass() echo "Do An"; public function useSelf() self::echoClass(); $doan = new DoAn();$doan->useSelf(); // công dụng là do Anvà
class DoAn public static function echoClass() echo "Do An"; public function useSelf() $this->echoClass(); $doan = new DoAn();$doan->useSelf(); // hiệu quả là bởi AnKết quả của tất cả ví dụ trên số đông như nhau, vậy nên:
Có thể hotline static function bởi $this
Sau lúc qua các phương thức static, mình đã thử với thuộc tính static thông qua ví dụ, thứ nhất là sử dụng $this:
class DoAn public static $type = "Do An"; public function setType($type) $this->type = $type; public function echoType() echo $this->type; $doan = new DoAn();$doan->echoType(); // lỗi Notice: Undefined property: DoAn::$typeMình bao gồm khai báo $type vào class, vậy lý do lại báo lỗi thuộc tính ko được có mang nhỉ ??


class DoAn public static $type = "Do An"; public function setType($type) self::$type = $type; public function echoType() echo self::$type; $doan = new DoAn();$doan->echoType(); // tác dụng là bởi Anthì code sẽ chạy bình thường. Từ đây ta bao gồm tiếp là:
Không thể cần sử dụng $this để truy cập cũng như biến hóa giá trị nằm trong tính static mà bắt buộc phải dùng self
Qua gần như ví dụ trên, bản thân tóm tắt lại như sau:
Tham chiếu đến các thành phần của đối tượng người tiêu dùng hiện tại | Tham chiếu đến các thành phần của class hiện nay tại |
Không dùng được sử dụng trong static function | Có dùng được bên trong static function |
Không thể truy vấn cũng như chuyển đổi giá trị của ở trong tính static | Có thể truy cập cũng như chuyển đổi giá trị của thuộc tính static |
Đều hoàn toàn có thể gọi static function | Đều rất có thể gọi static function |
Làm mất tính đa hình |