PHP面向对象(三)

封装性是面象对象编程中的三大特性之一,封装性就是把对象的属性和服务结合成一个独立的相同单位,并尽可能隐蔽对象的内部细节,包含两个含义:
1. 把对象的全部属性和全部服务结合在一起,形成一个不可分割的独立单位(即对象)。

2. 信息隐蔽,即尽可能隐蔽对象的内部细节,对外形成一个边界〔或者说形成一道屏障〕,只保留有限的对外接口使之与外部发生联系。

举例说明:

使用private这个关键字来对属性和方法进行封装:
原来的成员:
public $name;  // 声明人的姓名
public $sex;   // 声明人的性别
public $age;   // 声明人的年龄
public function run(){……}
改成封装的形式:
private $name;  // 把人的姓名使用private关键字进行封装
private $sex;   // 把人的性别使用private关键字进行封装
private $age;   // 把人的年龄使用private关键字进行封装
private function run(){……} // 把人的走路方法使用private关键字进行封装

注意:只要是成员属性前面有其它的关键字就要去掉原有的关键字”public”。

PHP的魔术方法:

在类与对象我们队对属性的读取和赋值操作是非常频繁的,因此在PHP5中,预定义了两个函数”__get()”和”__set()”来获取和赋值其属性,以及检查属性的”__isset()”和删除属性的方法”__unset()”。

__get()方法:这个方法用来获取私有成员属性值的,有一个参数,参数传入你要获取的成员属性的名称,返回获取的属性值, 这个方法不用我们手工的去调用,是在直接获取私有属性的时候自动调用的。

__set()方法:这个方法用来为私有成员属性设置值的,有两个参数,第一个参数为你要为设置值的属性名,第二个参数是要给属性设置的值,没有返回值。这个方法同样不用我们手工去调用,是在直接设置私有属性值的 时候自动调用的,同样属性私有的已经被封装上了,如果没有__set()这个方法,是不允许的。

举例说明:

<?php
class Person {
    // 下面是人的成员属性, 都是封装的私有成员
    private $name;      //人的名字
    private $sex;       //人的性别
    private $age;       //人的年龄
 
    // __get()方法用来获取私有属性
    function __get($property_name) {
        echo "在直接获取私有属性值的时候,自动调用了这个__get()方法<br />";
        if (isset($this->$property_name)) {
            return ($this->$property_name);
        } else {
            return null;
        }
    }
 
    // __set()方法用来设置私有属性
    function __set($property_name, $value) {
        echo "在直接设置私有属性值的时候,自动调用了这个__set()方法为私有属性赋值<br />";
        $this->$property_name = $value;
    }

}

$p1 = new Person();
 
// 直接为私有属性赋值的操作, 会自动调用__set()方法进行赋值
$p1->name = "张三";
$p1->sex = "男";
$p1->age = 20;
 
// 直接获取私有属性的值, 会自动调用__get()方法,返回成员属性的值
echo "姓名:" . $p1->name . "<br />";
echo "性别:" . $p1->sex . "<br />";
echo "年龄:" . $p1->age . "<br />";

 ?>

注释:如果不加上__get()和__set()方法,程序就会出错,因为不能在类的外部操作私有成员,而上面的代码是通过自动调用__get()和__set()方法来帮助我们直接存取封装的私有成员的。

__isset() 方法:"isset()" 是测定变量是否设定用的函数,传入一个变量作为参数,如果传入的变量存在则传回true,否则传回false。

__unset()方法:“unset()”这个函数的作用是删除指定的变量且传回true,参数为要删除的变量。

举例说明:

<?php
class Person {
    // 下面是人的成员属性
    private $name;      // 人的名子
    private $sex;       // 人的性别
    private $age;       // 人的年龄
 
    // __get()方法用来获取私有属性
    private function __get($property_name) {
        if (isset($this->$property_name)) {
            return ($this->$property_name);
        } else {
            return NULL;
        }
    }
 
    // __set()方法用来设置私有属性
    private function __set($property_name, $value) {
        $this->$property_name = $value;
    }
 
    // __isset()方法
    private function __isset($nm) {
        echo "isset()函数测定私有成员时,自动调用<br />";
        return isset($this->$nm);
    }
 
    //__unset()方法
    private function __unset($nm) {
        echo "当在类外部使用unset()函数来删除私有成员时自动调用的<br />";
        unset($this->$nm);
    }

}

$p1 = new Person();
$p1->name = "this is a person name";
 
// 在使用isset()函数测定私有成员时,自动调用__isset()方法帮我们完成,返回结果为true
echo var_dump(isset($p1->name)) . "<br >";
echo $p1->name . "<br />";
 
// 在使用unset()函数删除私有成员时,自动调用__unset()方法帮我们完成,删除name私有属性
unset($p1->name);
 
// 已经被删除了,所这行不会有输出
echo $p1->name;

?>

注释:

1、__set(), __get() 是专门为类的私有属性(private、protected)设立的,对于类的公开(public)属性,外面是可以直接访问与设置的(如:$p1->name),即不走__set(),__get()函数的!!!)
2、在PHP5.3及以后,上述魔术方法(__get(),__set(),__isset(),__unset() 等)提倡是 public 类型的,并且不是 private方法,否则会给出警告信息!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值