>  기사  >  백엔드 개발  >  PHP 액세스 제어: 공개/보호/비공개

PHP 액세스 제어: 공개/보호/비공개

伊谢尔伦
伊谢尔伦원래의
2016-11-23 14:16:421126검색

속성 또는 메소드의 액세스 제어는 앞에 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.&#39;<br>&#39;;
        echo $this->protected.&#39;<br>&#39;;
        echo $this->private.&#39;<br>&#39;;
    }
}
$obj = new MyClass();
echo $obj->public; //这行可以正常运行
echo $obj->protected; //这行会产生一个致命错误
echo $obj->private; //这行也会产生一个致命错误
$obj->printHello(); //正常输出public、protected、private的值
class MyClass2 extends MyClass
{
    protected $protected = &#39;Protected2&#39;;
    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 = &#39;hello&#39;;
        var_dump($this->foo);
        //我们也可以在这里调用私有的方法
        $other->bar();
    }
}
$test = new Test(&#39;test&#39;);
$test -> baz(new Test(&#39;other&#39;));

출력 결과:

string(4) "test"
private 메소드에 액세스했습니다.


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.