Công cộng:
Khi bạn khai báo một phương thức (hàm) hoặc thuộc tính (biến) là public
, các phương thức và thuộc tính đó có thể được truy cập bằng:
- Cùng một lớp đã khai báo nó.
- Các lớp kế thừa lớp khai báo ở trên.
- Bất kỳ yếu tố nước ngoài nào ngoài lớp này cũng có thể truy cập vào những thứ đó.
Thí dụ:
<?php
class GrandPa
{
public $name='Mark Henry'; // A public variable
}
class Daddy extends GrandPa // Inherited class
{
function displayGrandPaName()
{
return $this->name; // The public variable will be available to the inherited class
}
}
// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'
// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'
Được bảo vệ:
Khi bạn khai báo một phương thức (hàm) hoặc một thuộc tính (biến) là protected
, các phương thức và thuộc tính đó có thể được truy cập bởi
- Cùng một lớp đã khai báo nó.
- Các lớp kế thừa lớp khai báo ở trên.
Thành viên bên ngoài không thể truy cập các biến. "Người ngoài cuộc" theo nghĩa họ không phải là đối tượng của chính lớp khai báo.
Thí dụ:
<?php
class GrandPa
{
protected $name = 'Mark Henry';
}
class Daddy extends GrandPa
{
function displayGrandPaName()
{
return $this->name;
}
}
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error
Lỗi chính xác sẽ là:
Lỗi nghiêm trọng của PHP: Không thể truy cập thuộc tính được bảo vệ GrandPa :: $ name
Riêng tư:
Khi bạn khai báo một phương thức (hàm) hoặc thuộc tính (biến) là private
, các phương thức và thuộc tính đó có thể được truy cập bằng:
- Cùng một lớp đã khai báo nó.
Thành viên bên ngoài không thể truy cập các biến. Người ngoài theo nghĩa họ không phải là đối tượng của chính lớp được khai báo và thậm chí là các lớp kế thừa lớp đã khai báo.
Thí dụ:
<?php
class GrandPa
{
private $name = 'Mark Henry';
}
class Daddy extends GrandPa
{
function displayGrandPaName()
{
return $this->name;
}
}
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error
Các thông báo lỗi chính xác sẽ là:
Lưu ý: Tài sản không xác định: Daddy :: $ name
Lỗi nghiêm trọng: Không thể truy cập tài sản riêng GrandPa :: $ name
Phân tích Grandpa Class bằng Reflection
Chủ đề này không thực sự nằm ngoài phạm vi và tôi thêm nó vào đây chỉ để chứng minh rằng sự phản chiếu thực sự mạnh mẽ. Như tôi đã nêu trong ba ví dụ trên, protected
và private
các thành viên (thuộc tính và phương thức) không thể được truy cập bên ngoài lớp.
Tuy nhiên, với sự phản ánh, bạn có thể làm điều khác thường bằng cách truy cập protected
và private
các thành viên bên ngoài lớp học!
Vâng, phản ánh là gì?
Reflection thêm khả năng đảo ngược các lớp kỹ sư, giao diện, chức năng, phương thức và phần mở rộng. Ngoài ra, họ cung cấp các cách để lấy nhận xét doc cho các hàm, lớp và phương thức.
Lời nói đầu
Chúng tôi có một lớp được đặt tên Grandpas
và nói rằng chúng tôi có ba thuộc tính. Để dễ hiểu, hãy xem xét có ba grandpa với tên:
- Đánh dấu Henry
- John Clash
- Will Jones
Hãy để chúng tôi làm cho chúng (gán sửa đổi) public
, protected
và private
tương ứng. Bạn biết rất rõ rằng protected
và private
các thành viên không thể được truy cập bên ngoài lớp học. Bây giờ chúng ta hãy mâu thuẫn với tuyên bố bằng cách sử dụng sự phản chiếu.
Mật mã
<?php
class GrandPas // The Grandfather's class
{
public $name1 = 'Mark Henry'; // This grandpa is mapped to a public modifier
protected $name2 = 'John Clash'; // This grandpa is mapped to a protected modifier
private $name3 = 'Will Jones'; // This grandpa is mapped to a private modifier
}
# Scenario 1: without reflection
$granpaWithoutReflection = new GrandPas;
# Normal looping to print all the members of this class
echo "#Scenario 1: Without reflection<br>";
echo "Printing members the usual way.. (without reflection)<br>";
foreach($granpaWithoutReflection as $k=>$v)
{
echo "The name of grandpa is $v and he resides in the variable $k<br>";
}
echo "<br>";
#Scenario 2: Using reflection
$granpa = new ReflectionClass('GrandPas'); // Pass the Grandpas class as the input for the Reflection class
$granpaNames=$granpa->getDefaultProperties(); // Gets all the properties of the Grandpas class (Even though it is a protected or private)
echo "#Scenario 2: With reflection<br>";
echo "Printing members the 'reflect' way..<br>";
foreach($granpaNames as $k=>$v)
{
echo "The name of grandpa is $v and he resides in the variable $k<br>";
}
Đầu ra:
#Scenario 1: Without reflection
Printing members the usual way.. (Without reflection)
The name of grandpa is Mark Henry and he resides in the variable name1
#Scenario 2: With reflection
Printing members the 'reflect' way..
The name of grandpa is Mark Henry and he resides in the variable name1
The name of grandpa is John Clash and he resides in the variable name2
The name of grandpa is Will Jones and he resides in the variable name3
Quan niệm sai lầm phổ biến:
Xin đừng nhầm lẫn với ví dụ dưới đây. Như bạn vẫn có thể thấy, các thành viên private
và protected
không thể được truy cập bên ngoài lớp mà không sử dụng sự phản chiếu
<?php
class GrandPas // The Grandfather's class
{
public $name1 = 'Mark Henry'; // This grandpa is mapped to a public modifier
protected $name2 = 'John Clash'; // This grandpa is mapped to a protected modifier
private $name3 = 'Will Jones'; // This grandpa is mapped to a private modifier
}
$granpaWithoutReflections = new GrandPas;
print_r($granpaWithoutReflections);
Đầu ra:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
Chức năng sửa lỗi
print_r
, var_export
Và var_dump
là chức năng gỡ rối . Họ trình bày thông tin về một biến ở dạng người có thể đọc được. Ba hàm này sẽ tiết lộ các thuộc tính protected
và private
thuộc tính của các đối tượng với PHP 5. Các thành viên lớp tĩnh sẽ không được hiển thị.
Nhiêu tai nguyên hơn: