下面讲述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.同时操作几个属性那么我们需要构建成员方法;