PHP 访问控制 - private/protected/public

PHP 可以使用 privatepublicprotected 来控制类成员的可见性

PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的

  1. public(公有): 公有的类成员可以在任何地方被访问
  2. protected(受保护): 受保护的类成员则可以被其自身以及其子类和父类访问
  3. private(私有): 私有的类成员则只能被其定义所在的类访问

属性的访问控制

类属性必须定义为公有,受保护,私有之一

如果用 var 定义,则被视为公有

如果省略 var 则默认为公有

<?php

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;      // 这行能被正常执行
echo $obj->protected;   // 这行会产生一个致命错误
echo $obj->private;     // 这行也会产生一个致命错误
$obj->printHello();     // 输出 Public、Protected 和 Private


class MyClass2 extends MyClass
{
    // 可以对 public 和 protected 进行重定义,但 private 而不能
    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、Protected2 和 Undefined

方法的访问控制

类中的方法可以被定义为公有,私有或受保护

如果没有设置这些关键字,则该方法默认为公有

<?php

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\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
关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.