속성 또는 메소드의 액세스 제어는 앞에 public, protected 또는 private 키워드를 추가하여 달성됩니다. public으로 정의된 클래스 멤버는 어디에서나 액세스할 수 있습니다. protected로 정의된 클래스 멤버는 자체 클래스와 해당 하위 클래스 및 상위 클래스에서 액세스할 수 있습니다. private으로 정의된 클래스 멤버는 해당 멤버가 정의된 클래스에서만 액세스할 수 있습니다.
1. 속성 접근 제어
클래스 속성은 public, protected, private 중 하나로 정의되어야 합니다. var로 정의하면 공개로 간주됩니다.
예제 #1 속성 선언
class MyClass { public $public = 'Public'; protected $protected = 'Protected'; private $private = 'Private'; function printHello() { echo $this->public.'<br>'; echo $this->protected.'<br>'; echo $this->private.'<br>'; } } $obj = new MyClass(); echo $obj->public; //这行可以正常运行 echo $obj->protected; //这行会产生一个致命错误 echo $obj->private; //这行也会产生一个致命错误 $obj->printHello(); //正常输出public、protected、private的值 class MyClass2 extends MyClass { protected $protected = 'Protected2'; function printHello(){ echo $this->public; echo $this->protected; echo $this->private; } } $obj2 = new MyClass2(); echo $obj2->public; //这行可以正常执行 echo $obj2->private; //未定义private echo $obj2->protected; //产生一个致命的错误 $obj2->printHello(); //输出Public、Protected和Undefined
참고: 호환성상의 이유로 PHP 4에서 변수를 정의하기 위해 var 키워드를 사용하는 방법은 PHP 5에서도 여전히 유효합니다. ). PHP 5.1.3 이전 버전에서는 이 구문으로 인해 E_STRICT 경고가 발생했습니다.
메서드 액세스 제어
클래스의 메서드는 공개, 비공개 또는 보호로 정의될 수 있습니다. 이러한 키워드가 설정되지 않은 경우 메서드는 기본적으로 public으로 설정됩니다.
예제 #2 메소드 선언
class MyClass { //声明一个公有的构造函数 public function __construct(){} //声明一个公有的方法 public function MyPublic(){} //声明一个受保护的方法 protected function MyProtected(){} //声明一个私有的方法 private function MyPrivate(){} //此方法为公有 function Foo() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); } } $myclass = new MyClass; $myclass -> MyPublic(); //这行能被正常执行 $myclass -> MyProtected(); //这行会产生一个致命错误 $myclass -> MyPrivate(); //这行会产生一个致命错误 $myclass -> Foo(); //公有,受保护,私有都可以执行 class MyClass2 extends MyClass { //此方法为公有 function Foo2() { $this->MyPublic(); $this->MyProtected(); $this->MyPrivate(); //这行会产生一个致命错误 } } $myclass2 = new MyClass2; $myclass2 -> MyPublic(); //这行能被正常执行 $myclass2 -> Foo2(); //公有和受保护的都可以执行,但私有的不行 class Bar { public function test(){ $this->testPrivate(); $this -> testPublic(); } public function testPublic(){ echo "Bar::testPublic<br>"; } private function testPrivate(){ echo "Bar::testPrivate<br>"; } } class Foo extends Bar { public function testPublic(){ echo "Foo::testPublic<br>"; } public function testPrivate(){ echo "Foo::testPrivate<br>"; } } $myFoo = new Foo(); $myFoo -> test(); //Bar::testPrivate //Foo::testPublic
다른 객체의 접근 제어
동일한 클래스의 객체는 동일한 인스턴스가 아니더라도 서로의 private 및 protected 멤버에 접근할 수 있습니다. 이는 이러한 개체의 내부 구현 세부 정보가 알려져 있기 때문입니다.
예제 #3 동일한 객체 유형의 private 멤버에 액세스
class Test { private $foo; public function __construct($foo) { $this->foo = $foo; } private function bar() { echo "Accessed the private method."; } public function baz(Test $other) { //我们可以在这里改变私有属性的值 $other->foo = 'hello'; var_dump($this->foo); //我们也可以在这里调用私有的方法 $other->bar(); } } $test = new Test('test'); $test -> baz(new Test('other'));
출력 결과:
string(4) "test"
private 메소드에 액세스했습니다.