สาธารณะ:
เมื่อคุณประกาศเมธอด (ฟังก์ชัน) หรือคุณสมบัติ (ตัวแปร) เป็นpublic
เมธอดและคุณสมบัติเหล่านั้นสามารถเข้าถึงได้โดย:
- คลาสเดียวกับที่ประกาศไว้
- คลาสที่สืบทอดคลาสที่ประกาศข้างต้น
- องค์ประกอบต่างประเทศใด ๆ นอกคลาสนี้ยังสามารถเข้าถึงสิ่งเหล่านั้นได้
ตัวอย่าง:
<?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'
มีการป้องกัน:
เมื่อคุณประกาศเมธอด (ฟังก์ชัน) หรือคุณสมบัติ (ตัวแปร) เป็นprotected
เมธอดและคุณสมบัติเหล่านั้นสามารถเข้าถึงได้โดย
- คลาสเดียวกับที่ประกาศไว้
- คลาสที่สืบทอดคลาสที่ประกาศข้างต้น
สมาชิกคนนอกไม่สามารถเข้าถึงตัวแปรเหล่านั้นได้ "คนนอก" ในแง่ที่ว่าพวกเขาไม่ใช่วัตถุของคลาสที่ประกาศตัวเอง
ตัวอย่าง:
<?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
ข้อผิดพลาดที่แน่นอนคือ:
ข้อผิดพลาดร้ายแรงของ PHP: ไม่สามารถเข้าถึงคุณสมบัติที่ได้รับการป้องกัน GrandPa :: $ name
เอกชน:
เมื่อคุณประกาศเมธอด (ฟังก์ชัน) หรือคุณสมบัติ (ตัวแปร) เป็นprivate
เมธอดและคุณสมบัติเหล่านั้นสามารถเข้าถึงได้โดย:
สมาชิกคนนอกไม่สามารถเข้าถึงตัวแปรเหล่านั้นได้ บุคคลภายนอกในแง่ที่ว่าพวกเขาไม่ใช่วัตถุตัวอย่างของคลาสที่ประกาศเองและแม้แต่คลาสที่สืบทอดคลาสที่ประกาศ
ตัวอย่าง:
<?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
ข้อความผิดพลาดที่แน่นอนจะเป็น:
ประกาศ: คุณสมบัติที่ไม่ได้กำหนด: Daddy :: $ name
ข้อผิดพลาดร้ายแรง: ไม่สามารถเข้าถึงทรัพย์สินส่วนตัว GrandPa :: $ name
ผ่าชั้นคุณปู่โดยใช้การสะท้อนแสง
หัวเรื่องนี้ไม่ได้อยู่นอกขอบเขตจริงๆและฉันกำลังเพิ่มที่นี่เพียงเพื่อพิสูจน์ว่าการสะท้อนนั้นมีประสิทธิภาพจริงๆ ดังที่ฉันได้กล่าวไว้ในตัวอย่างสามข้อข้างต้นprotected
และprivate
สมาชิก (คุณสมบัติและวิธีการ) ไม่สามารถเข้าถึงได้นอกชั้นเรียน
อย่างไรก็ตามด้วยการไตร่ตรองคุณสามารถทำสิ่งพิเศษได้แม้กระทั่งการเข้าถึงprotected
และprivate
สมาชิกนอกชั้นเรียน!
การสะท้อนคืออะไร
Reflection เพิ่มความสามารถในการเรียนวิศวกรรมย้อนกลับส่วนต่อประสานฟังก์ชั่นวิธีการและส่วนขยาย นอกจากนี้ยังมีวิธีเรียกค้นความคิดเห็นเอกสารสำหรับฟังก์ชั่นชั้นเรียนและวิธีการต่างๆ
คำนำ
เรามีคลาสชื่อGrandpas
และบอกว่าเรามีสามคุณสมบัติ เพื่อความเข้าใจง่ายลองพิจารณาชื่อของคุณปู่สามคนที่มีชื่อ:
- มาร์คเฮนรี่
- John Clash
- Will Jones
ขอให้เราทำให้พวกเขา (ปรับเปลี่ยนกำหนด) public
, protected
และprivate
ตามลำดับ คุณรู้ดีว่าprotected
และprivate
สมาชิกไม่สามารถเข้าถึงนอกชั้นเรียน ตอนนี้ขอขัดแย้งกับการใช้คำสั่งสะท้อน
รหัส
<?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>";
}
เอาท์พุท:
#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
ความเข้าใจผิดที่พบบ่อย:
โปรดอย่าสับสนกับตัวอย่างด้านล่าง อย่างที่คุณยังคงเห็นprivate
และprotected
สมาชิกไม่สามารถเข้าถึงได้นอกชั้นเรียนโดยไม่ใช้การสะท้อนกลับ
<?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);
เอาท์พุท:
GrandPas Object
(
[name1] => Mark Henry
[name2:protected] => John Clash
[name3:GrandPas:private] => Will Jones
)
ฟังก์ชั่นการแก้จุดบกพร่อง
print_r
, var_export
และvar_dump
มีฟังก์ชั่นการดีบัก พวกเขานำเสนอข้อมูลเกี่ยวกับตัวแปรในรูปแบบที่มนุษย์อ่านได้ ฟังก์ชั่นทั้งสามนี้จะเปิดเผยprotected
และprivate
คุณสมบัติของวัตถุที่มี PHP 5 สมาชิกชั้นคงที่จะไม่แสดง
แหล่งข้อมูลเพิ่มเติม: