PHP: private, protected và public
Giải phóng thời gian, khai phóng năng lực
Tầm vực của thuộc tính hay phương thức có thể được định nghĩa bằng cách đặt phía trước tên thuộc tính từ khóa public, protected hoặc private. Các thành phần lớp được khai báo là public có thể được truy cập ở mọi nơi. Các thành phần protected chỉ có thể được truy cập trong lớp chứa chúng và trong lớp con của lớp đó. Các thành phần private chỉ có thể được truy cập từ lớp chứa chúng.
Tầm vực của thuộc tính
Các thuộc tính của lớp được khai báo kèm từ khóa public, private hoặc protected. Nếu thuộc tính nào được khai báo sử dụng từ khóa var thì thuộc tính đó mặc định có tầm vực là public.
Ví dụ 1: Khai báo thuộc tính.
<?php
/**
* Định nghĩa MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Làm việc
echo $obj->protected; // Lỗi
echo $obj->private; // Lỗi
$obj->printHello(); // Hiển thị Public, Protected and Private
/**
* Định nghĩa MyClass2
*/
class MyClass2 extends MyClass
{
// Ta có thể khai báo lại phương thức public và protected, nhưng không được private
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Làm việc
echo $obj2->protected; // Lỗi
echo $obj2->private; // Không định nghĩa
$obj2->printHello(); // Hiển thị Public, Protected2, Undefined
?>
Lưu ý: PHP 4 vẫn hỗ trợ việc khai báo biến với từ khóa var. PHP 5 trước 5.1.3 thì việc sử dụng var sẽ phát sinh cảnh báo E_STRICT
.
Tầm vực của phương thức
Các phương thức của lớp có thể được định nghĩa là public, private hoặc protected. Những phương thức khai báo mà không có từ khóa tầm vực sẽ mặc định là public.
Ví dụ 2: Khai báo phương thức.
<?php
/**
* Định nghĩa MyClass
*/
class MyClass
{
// Định nghĩa hàm tạo public
public function __construct() { }
// Định nghĩa phương thức public
public function MyPublic() { }
// Định nghĩa phương thức protected
protected function MyProtected() { }
// Định nghĩa phương thức private
private function MyPrivate() { }
// Phương thức này sẽ có tầm vực là public
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // OK
$myclass->MyProtected(); // Lỗi
$myclass->MyPrivate(); // Lỗi
$myclass->Foo(); // Public, Protected và Private
/**
* Định nghĩa MyClass2
*/
class MyClass2 extends MyClass
{
// public
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Fatal Error
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // OK
$myclass2->Foo2(); // Public và Protected làm việc, Private thì không
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
Tầm vực của những đối tượng khác nhau
Các đối tượng có cùng kiểu có thể truy cập tới các thành phần private và protected mặc dù chúng không cùng thể hiện. Lý do là bởi vì việc thực thi những chi tiết cụ thể luôn được biết đến khi ở bên trong các đối tượng đó.
Ví dụ 3: Truy cập các thành phần private của các đối tượng cùng kiểu.
<?php
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Accessed the private method.';
}
public function baz(Test $other)
{
// Ta có thể thay đổi giá trị của thuộc tính private:
$other->foo = 'hello';
var_dump($other->foo);
// Ta cũng có thể gọi được phương thức private:
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
Ví dụ trên output như sau:
string(5) "hello" Accessed the private method.
Giải phóng thời gian, khai phóng năng lực