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. ACM退役记&&回忆录

    ACM退役记 2017.9.19星期二,"九一八事变"八十六年后的第二天,永远记住这个日子,刚好是我报名ACM到现在,刚好满一年,而今天正是我注册杭州电子科技大学OJ的时间(就是这 ...

  2. MyEclipse 快捷键问题

    解决Myeclipse提示快捷键Alt+/不可用问题 http://blog.163.com/cd-key666/blog/static/648929422011229123826/ 解决Myecli ...

  3. 框架基础:ajax设计方案(六)--- 全局配置、请求格式拓展和优化、请求二进制类型、浏览器错误搜集以及npm打包发布

    距离上一次博客大概好多好多时间了,感觉再不搞点东西出来,感觉就废了的感觉.这段时间回老家学习驾照,修养,然后7月底来上海求职(面了4家,拿了3家office),然后入职同程旅游,项目赶进度等等一系列的 ...

  4. 1.Bootstrap-简介

    1.介绍 Bootstrap 是一个用于快速开发 Web 应用程序和网站的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的. 2.HTML 模板 一个使用了 Boots ...

  5. java从命令行接收多个数字,求和程序分析

    问题:编写一个程序,此程序从命令行接收多个数字,求和之后输出结果. 1.设计思想 (1)声明两个变量接收输入的字符串 (2)将字符串转换成int类型 (3)输出求和 2.程序流程图 3.源程序代码 i ...

  6. 基于maven创建和部署Webx项目

    1.准备工作 下载 Webx Maven 项目的目录结构Artifact插件. archetype-webx-quickstart-1.0.tar.gz插件:http://central.maven. ...

  7. hdu4704 Sum 2013 Multi-University Training Contest 10 数论题

    Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Subm ...

  8. CentOS7 +vsftpd (一)之 匿名

    CentOS7 +vsftpd (一)之 匿名 ftp的搭建是一个基础性的工作,CentOS7 +vsftpd 是一个比较容易实现的平台,但在搭建中问题会不少,本系列将通过四篇随笔与大家分享. 一.C ...

  9. javascript的数值转换 number()详解

    ---恢复内容开始--- number() parseInt() parseFloat()这三个函都可以把数非数值转换为数值,我们看看他们的区别在哪里 一 Number() 转型函数Number()是 ...

  10. Ubuntu16.04 install mysql5.X

    打开终端: Ctrl+Alt+T 安装ubuntu自带的mysql-server: sudo apt-get install mysql-server 输出Y按回车如下图: 默认安装为root用户,所 ...