PHP OOP编程 操作protected private

下面讲述3中方法进行:

1.魔术方法__get,__set

 

<?php
header("content-type:text/html;charset=utf-8");

class Pesson{


    public $name;
    protected $nickname;
    private $address;

    public function __construct($name,$nickname,$address){
        $this->name = $name;        
        $this->nickname = $nickname;        
        $this->address = $address;        
    }

    // 魔术方法 改变保护私有属性__set,__get
    public function __get($pro_name){

        if(property_exists($this,$pro_name)){
            return $this->$pro_name;
        }else{
            echo "没有这个属性";
        }
    }
    public function __set($pro_name,$pro_val){

        if(property_exists($this,$pro_name)){
            $this->$pro_name = $pro_val;
        }else{
            echo "没有这个属性";
        }
    }

}

$pl = new Pesson("小明","葫芦娃","葫芦山");

$pl->name = "大娃";
$pl->nickname = "金娃";
$pl->address = "葫芦岛";

echo "<br> 信息如下:";
echo "<br> 姓名: ".$pl->name;
echo "<br> 别名: ".$pl->nickname;
echo "<br> 地址: ".$pl->address;
#------------
// 信息如下:
// 姓名: 大娃
// 别名: 金娃
// 地址: 葫芦岛
#----------总结:
# __get __set
#优点: ==> 简单, 一对就搞定了private ,protected;
#缺点: ==> 破坏了class 的private protected 保护性 无法进行控制

# __get __set
#优点: ==> 简单, 一对就搞定了private ,protected;
#缺点: ==> 破坏了class 的private protected 保护性 无法进行控制

2. 每个属性写一个get/set 方法

<?php
header("content-type:text/html;charset=utf-8");
#第二种 给每一个变量都提供一个 get/set方法;
class Book{

    public $bookname;
    public $author;
    protected $price;
    private $saleNum;
    public function __construct($bookname,$author,$price,$saleNum){
        $this->bookname = $bookname;
        $this->author = $author;
        $this->price = $price;
        $this->saleNum = $saleNum;
    }

    // 给 price和saleNum 提供一个getXXX 和setXXX 一对方法

    public function setPrice($price){
        //$price 为数字
        if(is_numeric($price)&&$price>0.0){
             $this->price = $price;
        }else{
            echo "输入不正确";
        }

    }
    public function getPrice($price){
        return $this->price;
    }

    public function setSaleNum($saleNum){
        if(is_int($saleNum)&&$saleNum>0){
            $this->saleNum = $saleNum;
        }else{
            echo "输入不正确";
        }
    }

    public function getSaleNum(){
        return $this->saleNum;
    }

}
$book = new Book("笑傲江湖","金庸",34.5,'');
$book->setSaleNum(10);
var_dump($book);

// object(Book)[1]
//   public 'bookname' => string '笑傲江湖' (length=12)
//   public 'author' => string '金庸' (length=6)
//   protected 'price' => float 34.5
//   private 'saleNum' => int 10

#------总结
# 优点 灵活的处理了protected private 的值问题,并且保证程序的健壮性;
# 缺点 每个属性都要这样去设置,增加了代码的行数; 但是这也不是什么事情;
# 备注 推荐这样使用
#

 

#------总结

# 优点 灵活的处理了protected private 的值问题,并且保证程序的健壮性;

# 缺点 每个属性都要这样去设置,增加了代码的行数; 但是这也不是什么事情;

# 备注 推荐这样使用

 

3.成员方法进行操作多个属性->其实也是第二种的延伸;

<?php
header("content-type:text/html;charset=utf-8");

class Movie {

    public $name; // 电影名
    public $time; // 时长
    protected $mainName; // 主演
    private $sale_num; // 预定票



    public function __construct($name,$time,$mainName,$sale_num){
        
        $this->name = $name;
        $this->time = $time;
        $this->mainName = $mainName;
        $this->sale_num = $sale_num;
    }


    public function print_movie_info($name,$time,$mainName,$sale_num){

        if(!empty($name)&&!empty($time)&&!empty($mainName)&&is_int($sale_num)&&$sale_num>0){
            $this->name = $name;
            $this->time = $time;
            $this->mainName = $mainName;
            $this->sale_num = $sale_num;
        }else{
            echo "输入有误";
        }
    }



}

$movie = new Movie("天龙八里",124,"钟汉良",'');

var_dump($movie);
echo "<br>";
$movie->print_movie_info("侠客行",1222,"白痴",10000);
var_dump($movie);

// object(Movie)[1]
//   public 'name' => string '天龙八里' (length=12)
//   public 'time' => int 124
//   protected 'mainName' => string '钟汉良' (length=9)
//   private 'sale_num' => string '' (length=0)

// object(Movie)[1]
//   public 'name' => string '侠客行' (length=9)
//   public 'time' => int 1222
//   protected 'mainName' => string '白痴' (length=6)
//   private 'sale_num' => int 10000

4.总结

   开发中我们如何选择这三种方式:

   1. 如果我们要直接$Class->$name  直接访问属性名 那么就用 __get/__set;

   2. 在开发中我们要对属性进行验证那么就用setXXX/getXXX;

   3.同时操作几个属性那么我们需要构建成员方法;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值