公衆:
メソッド(関数)またはプロパティ(変数)をとして宣言すると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にアクセスできません
リフレクションを使用したおじいちゃんクラスの解剖
この主題は実際には範囲外ではありません。ここで、反射が本当に強力であることを証明するためだけに追加します。上記の3つの例で述べたようにprotected
、private
メンバー(プロパティとメソッド)はクラスの外部からはアクセスできません。
ただし、リフレクションを使用すると、クラス外のメンバーやメンバーにアクセスするだけで、並外れたことを実行できます。protected
private
さて、反射とは何ですか?
リフレクションは、クラス、インターフェイス、関数、メソッド、拡張機能をリバースエンジニアリングする機能を追加します。さらに、関数、クラス、メソッドのドキュメントコメントを取得する方法を提供します。
前文
という名前のクラスがあり、Grandpas
3つのプロパティがあるとします。簡単に理解できるように、名前の付いた3人のおじいちゃんがいると考えてください。
- マーク・ヘンリー
- ジョン・クラッシュ
- ウィル・ジョーンズ
私たちは(アサイン修飾子)、それらを作ってみましょう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
されているデバッガ機能。それらは、人間が読める形式で変数に関する情報を示します。これらの3つの関数は、PHP 5のオブジェクトのprotected
およびprivate
プロパティを明らかにします。静的クラスメンバーは表示されません。
その他のリソース: