1. 封装

1.1什么是封装?

通过访问修饰符,将类中的属性和方法进行私有化处理,并提供唯一的设置和读取的

set/get方法,以实现访问控制。这个过程称为封装。

注意:是实现访问控制,而不是拒绝访问。也就是说,单纯的私有化属性并不是封装,必须提供对应的set/get方法,控制用户使用我们提供的方法进行操作。

1.2封装有什么作用?

① 使用者只需要关心类能够提供哪些功能,而不需要关心这些功能的实现细节。(方法的封装)

② 对用户的数据进行控制,防止设置不合法的数据,并控制返回给用户的数据。(属性的封装)

1.3如何实现封装?

① 方法的封装

对于一些只需要在类内部使用,而不需要对外提供功能的函数,我们可以使用private关键字进行私有化处理。

          private function formaName(){}
function showName(){
$this->formaName();// 私有化的方法,只能在类内部使用$this调用
}

② 属性的封装 + set/get方法

          private $age;
function setAge($age){
$this->age = $age;
}
function getAge(){
return $this->age;
}
使用属性:$对象名->setAge(27);
echo $对象名->getAge();
 

③ 属性的封装 + 魔术方法

          private $age;
function __set($key,&value){
$this->$key = $value;
}
function __get($key){
return $this->$key;
}
使用属性:$对象名->age=12; // 设置私有属性时,将自动调用__set()
$对象名->age; // 读取私有属性时,将自动调用__get()

1.4封装中常用的魔术方法

 

__set($key,$value):设置类中非公开属性时,将自动调用魔术方法。并且传递两个参数,$key--设置的属性名 $value--设置的属性值,没有返回值。

__get($key):读取类中非公开属性时,将自动调用魔术方法。并且传递一个参数,$key--读取的属性名,返回值:想要显示的属性值。

__isset($key):在类外部使用isset()检测非公开属性时自动调用。

>>> 类外部使用isset()检测非公开属性,摸人家呢不带,返回false;

>>> 所以,我们可以使用__isset(),在内部将检测结果返回。

          function __isset($key){
return isset($this->$key);
}

__unset($key):在类外部使用unset()删除私有属性时,自动调用。

        function __unset($key){
unset($this->$key);
}
2. 继承

2.1什么叫继承?

子类继承父类,子类就拥有父类中非私有的属性和方法。

2.2如何实现继承?

给子类使用extends关键字,可以让子类继承父类。

class Student extends Person()
 

2.3继承的注意事项

① 子类只能继承父类的私有属性,不能继承private属性。

② 子类继承父类后,相当于把父类非私有属性和方法,直接copy到子类。可以直接使用$this->调用,与子类自身的属性和方法没有区别!

③ PHP只支持单继承,也就是一个类只能有一个父类。但是,PHP中可以多层继承,比如:

         class Person{}
class Student extends Person{}
class GoodStudent extends Student{}
// GoodStudent继承了Student类,也就拥有了Student类和Person类的所有非私有属性和方法。

2.4方法重写(方法覆盖)

条件① 子类继承父类

条件② 子类重写父类已有的同名方法
 

符合上述两个条件,称为方法覆盖,也叫方法重写。覆盖之后,子类调用方法,将直接调用子类自身重写之后的方法。

如果,子类重写了父类方法,那么在子类中如何调用父类的同名方法?

     Person::方法名(); // 使用父类名调用
parent::方法名(); // 使用parent关键字代指父类名

所以,当子类继承父类以后,第一步就是需要在子类中,重写父类的构造函数。而在子类的构造函数中,第一步需要将父类的构造函数进行调用赋值。

         function __construct($name,$age,$school){
  parent::__construct($name,$age);
  $this->school = $school;
  }

PHP中的封装和继承的更多相关文章

  1. C++内存中的封装、继承、多态(上)

    C++内存中的封装.继承.多态(上) 继我的上一篇文章:浅谈学习C++时用到的[封装继承多态]三个概念 此篇我们从C++对象内存布局和构造过程来具体分析C++中的封装.继承.多态. 一.封装模型的内存 ...

  2. C++内存中的封装、继承、多态(下)

    上篇讲述了内存中的封装模型,下篇我们讲述一下继承和多态. 二.继承与多态情况下的内存布局 由于继承下的内存布局以及构造过程很多书籍都讲得比较详细,所以这里不细讲.重点讲多态. 继承有以下这几种情况: ...

  3. c# 中的封装、继承、多态详解

    面向对象有封装.继承.多态这三个特性,面向对象编程按照现实世界的特点来管理复杂的事物,把它们抽象为对象,具有自己的状态和行为,通过对消息的反应来完成任务.这种编程方法提供了非常强大的多样性,大大增加了 ...

  4. Python中的封装,继承和多态

    面向对象的三大特性:封装,继承和多态 封装:在类的内部定义属性和方法,通过对象或类名来访问属性和方法,隐藏功能的实现细节,也可以设置访问权限. 广义的封装:实例化一个对象,给对象空间封装一些属性:狭义 ...

  5. Objective-C中的封装、继承、多态、分类

    封装的好处: 过滤不合理的值 屏蔽内部的赋值过程 让外界不必关注内部的细节 继承的好处: 不改变原来模型的基础上,拓充方法 建立了类与类之间的联系 抽取了公共代码 坏处:耦合性强(当去掉一个父类,子类 ...

  6. Java中的封装、继承、多态

    封装 在如何理解面向对象这篇文章中,提到所谓的封装就是"功能都给你做好了,你不必去理解它是怎么写出来的,直接使用即可.".但你得清楚一点,那就是这句话是相对于使用者来说的,而作为开 ...

  7. python面向对象中的封装、继承、多态

    封装 可以简单的理解为隐藏一切可以隐藏的实现细节,只向外界提供简单的编程接口.我们在类中定义的方法其实就是把数据和数据的操作封装起来了,在我们创建了对象之后,只需要给对象发送一个消息(调用方法)就可以 ...

  8. 从C++对象内存布局和构造过程来具体分析C++中的封装、继承、多态

    一.封装模型的内存布局 常见类对象的成员可能包含以下元素: 内建类型.指针.引用.组合对象.虚函数. 另一个角度的分类: 数据成员:静态.非静态 成员函数:静态.非静态.虚函数 1.仅包含内建类型的场 ...

  9. js中的封装、继承、多态

    Javascript是一门解释型的语言,是基于对象的,并不是真正的面向对象的语言,对变量类型的应用也是宽松的,其实它同样可以模拟面向对象的功能:  1 function myfun1(){  2    ...

随机推荐

  1. allego 输出报告说明

    List of Available Reports Assigned Function Report Lists all assigned functions, sorted by function ...

  2. mount挂载和交换分区swap

    目录 mount挂载 挂载方法 选项 查看设备 卸载命令 文件挂载配置文件fstab 交换文件与分区 swap优先级 三个工具free,df,du 扩展 移动介质 使用光盘 挂载USB设备 mount ...

  3. java 如何判断操作系统是Linux还是Windows

    String os = System.getProperty("os.name"); if(os.toLowerCase().startsWith("win") ...

  4. python入门之一python安装及程序运行

    Python 程序要运行,需要先安装python解释器 PVM(这里可对照java的JVM来理解)实际上,你不需要单独安装,直接安装python后就可以了 1.安装python 下载地址:http:/ ...

  5. angular之表单验证与ngMessages

    刚接触angular1.x很多经常用到的ngMessages的地方,这里顺便记一下,效果如下图: 如果引用了angular-messages.js报如下错误,说明你的angular.js和angula ...

  6. [LeetCode] 344 Reverse String && 541 Reverse String II

    原题地址: 344 Reverse String: https://leetcode.com/problems/reverse-string/description/ 541 Reverse Stri ...

  7. leetCode in Java (一)

    前言    感觉写博客是一个很耗心力的东西T_T,简单的写了似乎没什么用,复杂的三言两语也只能讲个大概,呸呸...怎么能有这些消极思想呢QAQ!那想来想去,先开一个leetcode的坑,虽然已经工作了 ...

  8. struts2中的Ajax异步校验

    登录时验证码的异步校验: 1.验证码生成的是图片因此在struts.xml文件里面配置action 时,result标签中type 属性是stream 2.验证码图片的src的值为配置action名字 ...

  9. java中继承和组合的区别

    子类继承父类,父类的所有属性和方法都可以被子类访问和调用.组合是指将已存在的类型作为一个新建类的成员变量类型,又叫"对象持有". 通过组合和继承,都可以实现系统功能的重用和代码的复 ...

  10. 浅谈Java抽象类

    什么是抽象类?这名字听着就挺抽象的,第一次听到这个名字还真有可能被唬住.但是,就像老人家所说的,一切反动派都是纸老虎,一切有着装x名字的概念也是纸老虎.好吧,我们已经从战略上做到了藐视它,现在就要战术 ...