PHP 面向对象编程之封装性

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);

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值