PHP 类与对象 —— 访问控制关键词

一、1、 public:所有类都能调用

              protected: 被其自身定义的类和子类、父类可以调用

              private:只能被其自身定义的类调用

      2、 类属性必须被定义为public(公有)、protected(受保护)、private(私有)之一。

             类方法没有设置,默认为public。

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

class Phone{
    public     $public     = 'Public';
    protected  $protected  = 'Protected';
    private    $private    = 'Private';

    function printHello(){
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }
    
}


$phone = new Phone();
echo $phone->public; //输出Public
echo $phone->protected; //报错,无法访问受保护的属性
echo $phone->private; //报错,无法访问私有的属性
$phone->printHello(); //输出Public Protected Private 

     

class Phone2 extends Phone{
    protected $protected = 'Protected2';

    function  printHelle(){
        echo $this->public;
        echo $this->protected;
        echo $this->private;
    }

}

$phone2 = new Phone2();
echo $phone2->public; //输出Public
echo $phone2->protected; //报错,无法访问被保护的属性
echo $phone2->private; //未定义当前private值,报错
$phone2->printHelle();//输出Public Protected2 Undefined property

     

class Phone{
    //声明一个公有的构造函数
    public function __construct(){}

    //声明一个公有的方法
    public function phonePublic(){}

    //声明一个受保护的方法
    protected function phoneProtected(){}

    //声明一个私有的方法
    private function phonePrivate(){}

    未声明访问控制,默认为public公有
    function Foo(){
        $this->phonePublic();
        $this->phoneProtected();
        $this->phonePrivate();
    }
}


$phone = new Phone();
$phone->phonePublic(); //正常运行  
$phone->phoneProtected(); //产生一个致命错误
$phone->phonePrivate(); //产生一个致命错误
$phone->Foo(); //正常运行

 

class PhoneTwo extends Phone{
    function Foo2(){
        $this->phonePublic();
        $this->phoneProtected();
        $this->phonePrivate();//会产生一个致命错误
    }

}

$phone2 = new PhonTwo();
$phone2->phonePublic();
$phone2->phoneProtected();
$phone2->phonePrivate();
$phone2->Foo2();//公有和受保护可以执行,私有不能执行

 3、访问同一个对象类型的私有成员:同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员

class Phone{
    private $phone;

    public function __construct($phone){
        $this->phone = $phone;
    }

    private function name(){
        echo '访问私有方法';
    }

    public function testName(Phone $other){
        //改变私有属性值
        $other->phone = 'iPhone';
        var_dump($other->phone);
        //调用私有方法
        $other->name();
    }
}

$phone = new Phone();
$phone->testName(new Phone('other'));


输出:
string(5) "iPhone"
"访问私有方法"

 

 

 4、构造方法如果定义成了私有,就不允许实例化,一般通过静态方法实例化对象

          比如单例模式只允许有一个全局唯一的对象。

class Phone {


    private static $name = null;


    private static function __construct(){

        echo '手机实例化';    
    
    }

    public static function getInstance(){

        if(empty(selft::$name)){

            //静态属性可以调用本类私有方法,因为私有方法只有本类可以调用,
            //只有调用构造函数才可以实例化对象        
            self::$name = new Phone();
        
        }else{

            return self::$name;
        }

    }
}



$phone = new Phone();//无法实例化(因为构造函数私有,不能在其他类别调用)


$phone = Phone::getInstance();//静态方法获得一个对象


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值