Загальнодоступне:
Коли ви оголошуєте метод (функцію) або властивість (змінну) як 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
члени поза класом!
Ну, що таке рефлексія?
Роздум додає можливість реверсувати інженерні класи, інтерфейси, функції, методи та розширення. Крім того, вони пропонують способи отримання док-коментарів щодо функцій, класів та методів.
Преамбула
У нас є клас з іменем Grandpas
і кажуть, що у нас є три властивості. Для легкого розуміння врахуйте, що є три діди з іменами:
- Марк Генрі
- Джон Clash
- Буде Джонс
Давайте зробимо їх (привласнення модифікаторів) 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. Статичні члени класу не будуть показані.
Більше ресурсів: