공공의:
메소드 (함수) 또는 특성 (변수)을로 선언하면 다음 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
를 가지고 있으며 세 가지 속성이 있다고 말합니다. 이해하기 쉽도록 이름이있는 할아버지가 세 명 있다고 생각하십시오.
우리가 그들 (할당 수정)을 만들어 보자 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
있는 디버거 기능 . 변수는 사람이 읽을 수있는 형태로 정보를 제공합니다. 이 세 함수는 PHP 5에서 객체의 속성 protected
과 private
속성을 나타냅니다 . 정적 클래스 멤버는 표시 되지 않습니다 .
추가 자료 :