php面向对象之二-封装性

原创
2016-12-05 13:26:27 880浏览

1.封装:

具体概念讲出来,感觉也不知道说的是什么.其实就是

在类的成员属性和成员方法前面,加上类似public protected private 的修饰符

目的:尽量地隐藏对象的内部细节,达到访问控制.[不是拒绝访问]. (对外形成一个屏障,只保留有限的对外接口与外部发生联系.)

2.封装的原则:

对象对外的部分不能够随意存取对象的内部数据(成员属性和成员方法),从而有效地避免了外部错误对它的"交叉感染",使软件错误能够局部化,大大减小查错和排错的难度.

3.修饰符public protected private

public :公有的,默认的 protected :受保护的 private :私有的

4.访问范围


是否可以访问对应的属性和方法

public protected private
类的外部 × ×
类的内部

①类的外部只有公有属性和方法才可以访问.

②其他属性和方法可以在类的内部声明公有方法间接地进行访问.

③在类的内部可以访问公有,私有,受保护的属性和方法.

④在类的内部不可以访问私有和受保护的属性和方法.

如果成员方法没有任何访问控制符,默认是public的,在任何地方都可以访问.(在对象外部就可以公有方法作为访问接口,间接地访问对象的内部细节).

5.关于封装中的几个常用魔术方法__set(),__get(),__isset(),__unset()

引出这几个魔术方法,首先要说一下,构造方法__construct()没有加关键字修饰,是公有方法(构造方法不要设置成私有的权限)用户可以使用构造方法在实例化对象后为私有属性赋初始值.

但是,我们已经实例化对象,在程序运行过程中想要对私有属性进行赋值操作.有两种方法

(1).在类的内部设置公有方法,专门来提供赋值,取值接口

class Person{
    private $name="紫藤";
    
    public function __construct(){
        echo $this->name;
    }    
    
    //赋值方法
     public function setvalue($name){
           $this->name=$name;          
     }
      public function getvalue(){
           echo $this->name;       
     }
}

//实例化
$mod = new Person();

结果是: 紫藤

$mod->setvalue('宝强');
$mod->getvalue();

结果是:宝强

(2)魔术方法__set(),__get(),__isset(),__unset()

如果像上面的每次都要去设置公有方法,很繁琐.在php5.1.0之后的版本中,预定义了__set(),__get(),用来完成对所有非公有属性都能获取和复制的操作.

__set($propertyName,$propertyValue)

有两个参数, 属性名属性值,在给非公有属性赋值时,会自动调用此方法(就是说在类中必须声明__set()) (代码后面补充)

__get($propertyName)在获取非公有属性的值时,会自动调用此方法.

检测非公有属性是否存在__isset(),删除一个对象的非公有属性__unset().为了防止用户主动调用这两个方法,要使用private关键字封装在对象中.

__isset($propertyName)检测非公有属性是否存.(这是一个辅助检测函数,没有检测功能),还要在外部调用isset()函数时,才会自动调用此方法.

__unset($propertyName)删除一个对象的非公有属性_,要在外部调用unset()函数时,才会自动调用此方法.

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。