Giới thiệu
Trong PHP, có thể có kiểu dữ liệu tổng hợp do người dùng xác định bằng cách sử dụng class từ khóa. Một thể hiện mới của lớp là một đối tượng. Đặc tính của đối tượng theo định nghĩa của lớp, có thể chứa các thành viên thuộc tính, hằng số và phương thức.
Khả năng truy cập (còn gọi là khả năng hiển thị) của một thành viên lớp phụ thuộc vào từ khóa tiền tố khả năng hiển thị được đính kèm trong định nghĩa của nó. PHP có ba từ khóa hiển thị - công khai , riêng tư và được bảo vệ . Một thành viên lớp được khai báo với từ khóa công khai có thể truy cập được từ anywhare. Một thành viên được bảo vệ có thể truy cập từ bên trong lớp của nó và bằng cách kế thừa lớp. Mặt khác, thành viên riêng tư chỉ có thể được truy cập bởi cùng một lớp mà nó được định nghĩa và không hiển thị với bất kỳ thứ gì bên ngoài nó.
Mức độ hiển thị thuộc tính
Thuộc tính là một thuộc tính của cá thể lớp. Nó có thể là một thuộc tính thể hiện (có giá trị khác nhau cho mỗi đối tượng) hoặc thuộc tính lớp có cùng giá trị cho mỗi đối tượng. Thuộc tính có thể thuộc bất kỳ kiểu dữ liệu PHP hợp lệ nào. Thuộc tính có khả năng hiển thị công khai theo mặc định. Nếu một thuộc tính được xác định bằng từ khóa var (hiện không được dùng nữa), thì thuộc tính đó được coi là công khai.
Ví dụ
<?php class myclass{ public $fname="Ajay"; var $lname; //treated as public private $marks=100; protected $age=20; } $obj=new myclass(); echo "$obj->fname\n"; $obj->lname="Diwan"; echo "$obj->marks\n"; $obj->age=21; ?>
Đầu ra
Kết quả sau cho thấy rằng các thuộc tính công cộng có thể được truy cập bên ngoài lớp, trong khi các thuộc tính riêng tư và được bảo vệ sẽ đưa ra các lỗi chưa tìm thấy
Ajay PHP Fatal error: Uncaught Error: Cannot access private property myclass::$marks PHP Fatal error: Uncaught Error: Cannot access protected property myclass::$age
Tuy nhiên, các thuộc tính riêng tư và được bảo vệ có thể được sử dụng bên trong hàm trong cùng một lớp
Ví dụ
<?php class myclass{ public $fname="Ajay"; var $lname; private $marks=100; protected $age=20; function displaydata(){ $this->lname="Diwan"; echo "$this->fname $this->lname\n"; echo "marks=$this->marks age=$this->age"; } } $obj=new myclass(); $obj->displaydata(); ?>
Đầu ra
Điều này sẽ tạo ra kết quả sau. -
Ajay Diwan marks=100 age=20
Khả năng hiển thị của Phương thức
Giống như các thuộc tính của lớp, các phương thức của lớp cũng có thể được gán khả năng hiển thị với các từ khóa công khai, riêng tư và được bảo vệ. Các phương thức cũng vậy, theo mặc định được coi là công khai.
Ví dụ
<?php class myclass{ public $fname="Ajay"; var $lname; private $marks=100; protected $age=20; public function setname(){ $this->fname="Anil"; $this->lname="Dave"; echo "name changed\n"; } private function setmarks(){ $this->marks=90; } protected function setage(){ $this->age=21; } function setdata(){ $this->setname(); $this->setmarks(); $this->setage(); } function displaydata(){ $this->lname="Diwan"; echo "$this->fname $this->lname\n"; echo "marks=$this->marks age=$this->age"; } } $obj=new myclass(); $obj->setname();//works $obj->setmarks();//error $obj->setage();/error $obj->setdata(); //private and protected methods called withing public method $obj->displaydata(); ?>
Đầu ra
Điều này sẽ tạo ra kết quả sau. -
name changed PHP Fatal error: Uncaught Error: Call to private method myclass::setmarks() from context '' PHP Fatal error: Uncaught Error: Call to protected method myclass::setage() from context '' Anil Dave marks=90 age=21
Khả năng hiển thị của phương pháp trong tính kế thừa
Cha mẹ các phương thức lớp có thể bị ghi đè trong con định nghĩa giai cấp. Các phương thức private và protected của cha không khả dụng cho đối tượng của lớp con. Tuy nhiên, một phương thức được bảo vệ trong lớp cha có thể được sử dụng trong một phương thức lớp con
Ví dụ
<?php class testclass{ public $x=10; private $y=20; protected $z=30; private function test(){ echo "testclass private method\n"; } public function test1(){ echo "testclass public method\n"; } protected function test2(){ echo "testclass protected method\n"; } function test3(){ echo "x=$this->x y=$this->y z=$this->z\n"; } } class newclass extends testclass{ function test1(){ echo "newclass public method\n"; } public function test4(){ $this->test(); $this->test1(); $this->test2(); } } $obj=new newclass(); echo $obj->test1(); echo $obj->test3(); echo $obj->test4(); ?>
Đầu ra
Điều này sẽ hiển thị kết quả sau
newclass public method x=10 y=20 z=30 PHP Fatal error: Uncaught Error: Call to private method testclass::test() from context 'newclass'
Mức độ hiển thị không đổi
Từ PHP 7.1 trở đi, các chế độ hiển thị có thể được sử dụng với các hằng số. Hiển thị mặc định của hằng là công khai
Ví dụ
<?php class testclass{ public const X=10; private const Y=20; protected const Z=30; function showconst(){ echo "x=" . self::X ; echo "y=" . self::Y; echo "z=" . self::Z ; } } $obj=new testclass(); $obj->showconst(); echo testclass::Y . "\n"; echo testclass::Z . "\n"; ?>
Đầu ra
Điều này sẽ hiển thị kết quả sau
x=10y=20z=30 PHP Fatal error: Uncaught Error: Cannot access private const testclass::Y PHP Fatal error: Uncaught Error: Cannot access protected const testclass::Z