欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  php教程

php面向对象之二-封装性

程序员文章站 2022-03-13 23:43:22
...

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()函数时,才会自动调用此方法.