Giới thiệu
Trong PHP, có thể định nghĩa kiểu dữ liệu phức hợp do người dùng tạo bằng từ khóa class. Instance mới của class là object. Đặc điểm của object phụ thuộc vào định nghĩa class, có thể chứa property, constant và method.
Khả năng truy cập (visibility) của thành viên class phụ thuộc từ khóa visibility prefix trong định nghĩa. PHP có 3 visibility keywords: public, private và protected. Thành viên public truy cập được từ bất cứ đâu. protected truy cập từ trong class và class kế thừa. private chỉ truy cập được trong class định nghĩa nó, không visible bên ngoài.
Property Visibility
Property là thuộc tính của instance class. Có thể là instance property (giá trị khác nhau cho mỗi object) hoặc class property (static, cùng giá trị cho mọi object). Property có thể là bất kỳ kiểu PHP hợp lệ nào. Mặc định property là public. Nếu dùng từ khóa var (đã deprecated), nó được coi là public.
Ví dụ
Property với các visibility
<?php
class MyClass {
public $fname = "Ajay";
var $lname; // được coi là public
private $marks = 100;
protected $age = 20;
}
$obj = new MyClass();
echo "$obj->fname\n";
$obj->lname = "Diwan";
echo "$obj->marks\n"; // Lỗi: private
$obj->age = 21; // Lỗi: protected
?>
Kết quả
Ajay PHP Fatal error: Uncaught Error: Cannot access private property MyClass::$marks PHP Fatal error: Uncaught Error: Cannot access protected property MyClass::$age
Private/Protected property dùng trong class
Tuy nhiên, private và protected property có thể dùng trong method cùng class:
<?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();
?>
Kết quả
Ajay Diwan marks=100 age=20
Method Visibility
Giống property, method cũng gán visibility bằng public, private, protected. Mặc định method là public.
Ví dụ method visibility
<?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(); // OK - public
$obj->setmarks(); // Lỗi - private
$obj->setage(); // Lỗi - protected
$obj->setdata(); // Private/protected được gọi trong public method
$obj->displaydata();
?>
Kết quả
name changed PHP Fatal error: Uncaught Error: Call to private method MyClass::setmarks() PHP Fatal error: Uncaught Error: Call to protected method MyClass::setage() Anil Dave marks=90 age=21
Method Visibility trong Inheritance (Kế thừa)
Method của Parent class có thể override trong Child class. Private và protected method của parent không khả dụng cho object của child. Tuy nhiên, method protected trong parent có thể dùng trong method của child class.
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(); // private parent - lỗi
$this->test1(); // public parent - OK
$this->test2(); // protected parent - OK trong child method
}
}
$obj = new NewClass();
echo $obj->test1();
echo $obj->test3();
echo $obj->test4();
?>
Kết quả
newclass public method x=10 y=20 z=30 PHP Fatal error: Uncaught Error: Call to private method TestClass::test() from context 'NewClass'
Constant Visibility
Từ PHP 7.1, visibility modes dùng được cho constants. Default visibility của constant là public.
<?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"; // Lỗi private
echo TestClass::Z . "\n"; // Lỗi protected
?>
Kết quả
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