가시성
속성, 메서드 또는 (PHP 7.1.0부터) 상수의 가시성은 선언에 public
, protected
또는 private
키워드를 접두사로 붙여 정의할 수 있습니다. public
으로 선언된 클래스 멤버는 어디에서나 액세스할 수 있습니다. protected
로 선언된 멤버는 클래스 자체 내에서 그리고 상속 및 부모 클래스를 통해서만 액세스할 수 있습니다. private
으로 선언된 멤버는 멤버를 정의하는 클래스에서만 액세스할 수 있습니다.
프로퍼티 가시성
클래스 속성은 public
, private
또는 protected
로 정의해야 합니다. var
를 사용하여 선언하면 속성은 public
으로 정의됩니다.
예제 #1 속성 선언
<?php
/**
* Define MyClass
*/
class MyClass
{
public $public = 'Public';
protected $protected = 'Protected';
private $private = 'Private';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj = new MyClass();
echo $obj->public; // Works
echo $obj->protected; // Fatal Error
echo $obj->private; // Fatal Error
$obj->printHello(); // Shows Public, Protected and Private
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// We can redeclare the public and protected properties, but not private
public $public = 'Public2';
protected $protected = 'Protected2';
function printHello()
{
echo $this->public;
echo $this->protected;
echo $this->private;
}
}
$obj2 = new MyClass2();
echo $obj2->public; // Works
echo $obj2->protected; // Fatal Error
echo $obj2->private; // Undefined
$obj2->printHello(); // Shows Public2, Protected2, Undefined
?>
메소드 가시성
클래스 메서드는 public
, private
또는 protected
로 정의할 수 있습니다. 명시적 가시성 키워드 없이 선언된 메서드는 공용으로 정의됩니다.
예제 #2 메소드 선언
<?php
/**
* Define MyClass
*/
class MyClass
{
// Declare a public constructor
public function __construct() { }
// Declare a public method
public function MyPublic() { }
// Declare a protected method
protected function MyProtected() { }
// Declare a private method
private function MyPrivate() { }
// This is public
function Foo()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate();
}
}
$myclass = new MyClass;
$myclass->MyPublic(); // Works
$myclass->MyProtected(); // Fatal Error
$myclass->MyPrivate(); // Fatal Error
$myclass->Foo(); // Public, Protected and Private work
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// This is public
function Foo2()
{
$this->MyPublic();
$this->MyProtected();
$this->MyPrivate(); // Fatal Error
}
}
$myclass2 = new MyClass2;
$myclass2->MyPublic(); // Works
$myclass2->Foo2(); // Public and Protected work, not Private
class Bar
{
public function test() {
$this->testPrivate();
$this->testPublic();
}
public function testPublic() {
echo "Bar::testPublic\n";
}
private function testPrivate() {
echo "Bar::testPrivate\n";
}
}
class Foo extends Bar
{
public function testPublic() {
echo "Foo::testPublic\n";
}
private function testPrivate() {
echo "Foo::testPrivate\n";
}
}
$myFoo = new Foo();
$myFoo->test(); // Bar::testPrivate
// Foo::testPublic
?>
상수 가시성
PHP 7.1.0부터 클래스 상수는 public
, private
또는 protected
로 정의될 수 있습니다. 명시적 가시성 키워드 없이 선언된 상수는 공개로 정의됩니다.
예제 #3 PHP 7.1.0부터 상수 선언
<?php
/**
* Define MyClass
*/
class MyClass
{
// Declare a public constant
public const MY_PUBLIC = 'public';
// Declare a protected constant
protected const MY_PROTECTED = 'protected';
// Declare a private constant
private const MY_PRIVATE = 'private';
public function foo()
{
echo self::MY_PUBLIC;
echo self::MY_PROTECTED;
echo self::MY_PRIVATE;
}
}
$myclass = new MyClass();
MyClass::MY_PUBLIC; // Works
MyClass::MY_PROTECTED; // Fatal Error
MyClass::MY_PRIVATE; // Fatal Error
$myclass->foo(); // Public, Protected and Private work
/**
* Define MyClass2
*/
class MyClass2 extends MyClass
{
// This is public
function foo2()
{
echo self::MY_PUBLIC;
echo self::MY_PROTECTED;
echo self::MY_PRIVATE; // Fatal Error
}
}
$myclass2 = new MyClass2;
echo MyClass2::MY_PUBLIC; // Works
$myclass2->foo2(); // Public and Protected work, not Private
?>
다른 객체로부터의 가시성
동일한 유형의 개체는 동일한 인스턴스가 아니더라도 서로 private
및 protected
멤버에 액세스할 수 있습니다. 왜냐하면 객체 내부의 특정 상세 구현부를 이미 알고 있기 때문입니다.
예제 #4 동일한 개체 유형의 비공개 멤버 액세스
<?php
class Test
{
private $foo;
public function __construct($foo)
{
$this->foo = $foo;
}
private function bar()
{
echo 'Accessed the private method.';
}
public function baz(Test $other)
{
// We can change the private property:
$other->foo = 'hello';
var_dump($other->foo);
// We can also call the private method:
$other->bar();
}
}
$test = new Test('test');
$test->baz(new Test('other'));
?>
위의 예는 다음을 출력합니다.
string(5) "hello" Accessed the private method.