1. 设置私有成员与私有成员的访问;
-
封装的修饰符
- 封装性是面向对象编程中的三大特性之一。封装并不是让成员属性或者成员方法在类的外部不能访问,而是把对象中的成员属性和成员方法加上访问修饰符,使其尽可能隐藏对象的内部细节,以达到对成员的访问控制(切记不是拒绝访问)。
- 简单来说,封装性就是把我们声明的成员属性或者成员方法给隐藏起来。
- PHP5 中支持如下3种访问修饰符:1. public(公有的,默认),2. private(私有的),3. protected(受保护的)
-
设置私有成员
- 只要在声明成员属性或成员方法时,使用 private 关键字修饰就是实现了对成员的私有封装。
# 实例:
# 我们已定义了一个封装,这个封装是私有的成员属性和私有的成员方法
class person{
private $name;
private $age;
private function say(){
……
}
}
- 访问私有成员
- 封装后的成员在对象的外部不能直接访问,只能在对象的内部方法中使用 $this 访问。
# 实例:
class person{
private $name;
public function say(){
return $this -> name;
}
}
实例:person.class.php
<?php
class person{
public $name = "zhangsan"; // 公有的
private $age = 18; // 私有的
protected $gender = 'male'; // 受保护的(在继承的时候用到)
// 在 PHP5 中是弃用的,但是在开发程序中很常用
//var $height; // 如果不确定使用哪种封装,就先用 var 来修饰,后期重新考虑修改。
// 私有的成员方法,不能在类的外部直接访问
private function getName(){
return $this -> name;
}
// 受保护的成员方法,不能在类的外部直接访问
protected function getAge(){
return $this -> age;
}
// 公有的成员方法,可以在类的外部直接访问
public function getGender(){
return $this -> gender;
}
// 私有的,公有的,受保护的成员方法都可以在类的内部直接访问
public function say(){
return $this -> getName() . $this->getAge() . $this->getGender();
}
}
$person = new person();
echo $person -> name; // 公有的是可以在类的外部直接访问
echo "<hr />";
//echo $person -> age; // 私有的是不能在类的外部直接访问
echo "<hr />";
//echo $person -> gender; // 受保护的也是不能在类的外部直接访问
//$person -> getName();
//$person -> getAge();
//echo $person -> getGender();
echo $person -> say();
2. 魔术方法 __set();
- 作用是:解决私有的(private),受保护的(protected)成员属性从类的外部进行赋值
- 有两个参数:$name 和 $value。第一个参数是要赋值的成员属性名,第二个参数是要给这个成员属性所赋的值
- 魔术方法都不需要手动调用,都是有一定的触发条件。我们在给私有的和受保护成员属性赋值的时候,程序自动调用
- 魔术方法都要修饰成 public
- 魔术方法可以进行一些流程处理,如果把成员属性直接修饰成 public,那就不能对程序有一些更好的控制
实例:person.class.php
<?php
class person{
private $name;
protected $age;
public function set($name, $value){
// 这里的 $name 是形参,和上面的 private $name 没有关系,这个形参的作用范围只有在这个方法体的内部
$this -> $name = $value;
}
// 魔术方法 __set() 是在给私有的或受保护的成员属性在类的外部直接赋值时被**自动调用**
// 第一个参数:要赋值的成员属性名
// 第二个参数:要赋的值
// 作用:可以更好的对程序进行流程控制
public function __set($name, $value){
if($name == 'age' && $value > 30){
$this -> $name = $value - 5;
}else{
$this -> $name = $value;
}
}
}
$person = new person();
// $person -> set("name", "zhangsan");
// $person -> set("age", 18);
// var_dump($person);
$person -> name = "lisi";
$person -> age = 31;
var_dump($person);
3. 魔术方法 __get();
- 在类的外部得到私有的(private)或者是受保护的(protected)成员属性
实例:person.class.php
<?php
class person{
private $name;
protected $age;
public function __construct($name, $age){
$this -> name = $name;
$this -> age = $age;
}
public function get($name){
return $this -> $name;
}
// 魔术方法 __get() 是在类的外部直接得到私有的或受保护的成员属性时被自动调用
// 参数:要访问的成员属性名
// 作用:可以得到私有的或受保护的成员属性。也可以对返回的结果进制控制
public function __get($name){
if($name == 'age') return 18;
return $this -> $name;
}
}
$person = new person("zhangsan", 20);
// echo $person -> age;
// echo $person -> get("name");
// echo "<hr />";
// echo $person -> get("age");
echo $person -> name;
echo "<hr />";
echo $person -> age;
4. 魔术方法 __isset();
实例:person.class.php
<?php
class person{
private $name;
protected $age;
public function __construct($name, $age){
$this -> name = $name;
$this -> age = $age;
}
public function is_set($name){
return isset($this -> $name);
}
// 魔术方法 __isset() 是在类的外部用函数 isset() 判断私有的或受保护的成员属性时被自动调用
// 参数:判断的成员属性名
// 作用:可以按需求去返回 false 或 true
public function __isset($name){
if($name == 'age') return false;
return isset($this -> $name);
}
}
$person = new person("zhangsan", 20);
var_dump(isset($person -> name));
var_dump(isset($person -> age));
//
var_Dump($person -> is_set("name"));
var_dump($person -> is_set("age"));
5. 魔术方法 __unset()。
实例:person.class.php
<?php
class person{
private $name;
protected $age;
public function __construct($name, $age){
$this -> name = $name;
$this -> age = $age;
}
public function un_set($name){
unset($this -> $name);
}
// 魔术方法 __unset() 是在类的外部用函数 unset()释放私有的或受保护的成员属性时被自动调用
// 参数:要释放的成员属性名
// 作用:可以按需求控制成员属性的释放操作
public function __unset($name){
if($name == 'name') return;
unset($this -> $name);
}
}
$person = new person("zhangsan", 20);
unset($person -> name);
unset($person -> age);
// $person -> un_set("name");
// $person -> un_set("age");
var_dump($person);