一、封装性封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作。

php提供了三种访问控制修饰符

public 表示全局,本类内部,类外部,子类都可以访问

protected 表示受保护的,只有本类或子类可以访问

private 表示私有的,只有本类内部可以访问

以上三种修饰符既可以修饰方法也可以修饰属性(变量),方法如果没有访问修饰符则默认是public,成员属性必须指定访问修饰符,在PHP4中也有这种写法 var $name,表示公开属性,不推荐这种写法

例:

复制代码 代码如下:

class Person{

public $name;

protected $age;

private $salary;

function __construct($name,$age,$salary){

$this->name=$name;

$this->age=$age;

$this->salary=$salary;

}

public function showinfo(){

//这表示三个修饰符都可以在本类内部使用

echo $this->name."||".$this->age."||".$this->salary;

}

}

$p1=new Person('张三',20,3000);

//这里属于类外部,那么如果用下面的方法访问age和salary都会报错

// echo $p1->age; echo$p1->salary;

?>

那么现在就想在外部访问protected和private的元素和方法该怎么办? 通常做法是通过public函数去访问这些变量 格式:

public function setxxxx($val){

$this->xxxx=$val;

}

public function getxxxx(){

return $this->xxxx;

}

这里带set和get只是为了识别方便,并非必要

如:

public function getsalary(){

return $this->salary; //扩展:这里可以调用一些方法,如判断用户名等,正确才给访问

}

在外部就可以通过 echo $p1->getsalary();

如果要访问 protected和private也可以使用以下方法,但不推荐使用,只要了解即可

__set() 和 __get()

__set()对protected或private属性进行赋值操作

__set($name,$val);

__get()获取 protected 或 private的值

__get($name);

如:

复制代码 代码如下:

class testa{

protected $name;

//使用__set()来管理所有属性

public function __set($pro_name,$pro_val){

//上面$pro_name和$pro_val可自定义

//下面$this->pro_name为既定,不可更改

$this->pro_name=$pro_val;

}

//使用__get()来获取所有属性值

public function __get($pro_name){

if(isset($pro_name)){

return $this->pro_name;

} else {

return null;

}

}

}

$n1=new testa();

//正常情况,类外部是不能访问protected属性的,但是用了上面的方法就可以对它们进行操作

$n1->name='小三';

echo $n1->name;

?>

//以上代码看懂就行,不推荐使用

二、继承性

先看一个例子:

复制代码 代码如下:

class Pupil{

public $name;

protected $age;

public function getinfo(){

echo $this->name.'||'.$this->age;

}

public function testing(){

echo 'this is pupil';

}

}

class Graduate{

public $name;

protected $age;

public function getinfo(){

echo $this->name.'||'.$this->age;

}

public function testing(){

echo 'this is Graduate';

}

}

?>

从上面的例子可以看出,当多个类有很多共同属性和方法时,代码的复用性不高,代码冗余,思考css中的处理方法

解决方法 :继承

复制代码 代码如下:

class Students{

public $name;

public $age;

public function __construct($name,$age){

$this->name=$name;

$this->age=$age;

}

public function showinfo(){

echo $this->name.'||'.$this->age;

}

}

class Pupil extends Students{

function testing(){

echo 'Pupil '.$this->name.' is testing';

}

}

class Graduate extends Students{

function testing(){

echo 'Graduate '.$this->name.' is testing';

}

}

$stu1=new Pupil('张三',20);

$stu1->showinfo();

echo '
';

$stu1->testing();

?>

从上面可以看出,继承就是一个子类(Subclass)通过 extends 父类 把父类(BaseClass)中的public 和 protected 的属性和方法继续下来,不能继承private属性和方法

语法结构:

class 父类名{}

class 子类名 extends 父类名{}

细节:

1、一个子类只能继承一个父类(这里指直接继承);如果希望继承多个类的属性和方法,可以使用多层继承

例:

复制代码 代码如下:

class A{

public $name='AAA';

}

class B extends A{

public $age=30;

}

class C extends B{}

$p=new C();

echo $p->name;//这里会输出AAA

?>

2、在创建某个子类对象时,默认情况下不会自动调用其父类的构造函数

例:

class A{

public function __construct(){

echo 'A';

}

}

class B extends A{

public function __construct(){

echo 'B';

}

}

$b=new B();//这里会优先输出B中的构造方法,如果B中没有构造方法才会输出A中的

3、在子类中如果需要访问父类的方法(构造方法、成员方法 方法的修饰符为protected或private),那么可以使用 父类::方法名 或者 parent::方法名 来完成【这里parent和以前提到的self都均为小写,大写报错】

class A{

public function test(){

echo 'a_test';

}

}

class B extends A{

public function __construct(){

//两种方法都行

A::test();

parent::test();

}

}

$b=new B();

5、如果一个子类(派生类)的方法与父类的方法完全一样时(public,protected),我们称为方法覆盖或方法重写(override),看下面的多态性

三、多态性

例 :

复制代码 代码如下:

class Animal{

public $name;

public $price;

function cry(){

echo 'i don\'t know';

}

}

class Dog extends Animal{

//覆盖、重写

function cry(){

echo 'Wang Wang!';

Animal::cry();//这里不会报错,能正确执行父类的cry();

}

}

$dog1=new Dog();

$dog1->cry();

?>

php多态性和继承是什么意思,封装 继承 多态的区别相关推荐

  1. 面向对象之:三大特性:继承(已讲),封装,多态

    目录 1.封装 2.多态 3.类的约束 4. super()深入了解 前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个 ...

  2. 04 面向对象之:三大特性:继承(已讲),封装,多态。

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  3. 面向对象封装继承多态五大基本原则魔法方法反射

    目录 面向对象 三大基本特征 五大基本原则 魔法方法 反射 面向对象 什么是面向对象 使用模板的思想,将世界万事万物使用对象来表示一个类型 面向对象和面向过程的区别: 面向对象的不就是使用程序处理事情 ...

  4. python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态

    写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...

  5. 对C++继承,封装,多态的理解

    用了C++一段时间,感觉对C++慢慢有了一点认识,在这和大家分享一下. C++是一款面向对象的语言,拥有面向对象语言的三大核心特性:继承,封装,多态.每一个特性的良好理解与使用都会为我们的编程带来莫大 ...

  6. C#里封装 继承 多态(包教包会)

    一.封装 C#中可使用类来达到数据封装的效果,这样可以使数据与方法封装成单一元素,以便于通过方法存取数据.除此之外,还可以控制数据的存取方式. 在面向对象编程中,大多数都是以类作为数据封装的基本单位. ...

  7. 04 面向对象之:三大特性:继承,封装,多态

    前言: Python面向对象的三大特性:继承,封装,多态 1.封装:把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块,函数,对象,打包成模块.这都属于封装的思想.具体的情况具体分析,比如, ...

  8. Python面向对象之:三大特性:继承,封装,多态以及类的约束

    前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...

  9. 小白理解——封装继承多态

                                      一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...

最新文章

  1. 95后实习生的远程办公体验(asp.net mvc\C#技术栈)
  2. Vue 脚手架结合 SpringBoot 构建前后端分离入门项目(实现增删改查)
  3. 服务器 设置 将 Tomcat 注册 到系统服务 及使用方法
  4. Effective java 第二章 对象 (2)
  5. HDU1847 博弈论 水题
  6. 解决THINKCMF后台文章的相册图集只能上传一个图片的问题
  7. 自定义Dialog的小实战——根据地区选择手机号码前缀
  8. 语义分割CCNet-Criss Cross Network论文中注意力机制Criss Cross Attention模块的tensorflow代码实现
  9. c语言快捷键的使用方法,电脑快捷键的使用方法
  10. 微信小程序——云开发|计费方式调整大家怎么看?
  11. redis知识盘点【陆】_客户端Jedis
  12. “分享到微信”的官方SDK和文档中的坑。。。
  13. [ubuntn]常用软件安装方法
  14. 区块链经济:机构加密经济学的初学者指南
  15. windows系统切换用户(通过cmd切换用户)
  16. 单位冲激信号 matlab,matlab单位冲激序列
  17. PKCS1_SignatureScheme_PSS
  18. 18V转12V的芯片,PW2312的BOM和DEMO文件
  19. 接口保护,element-ui+axios使用加密,后端php-laravel解密
  20. FBI针对HTTPS网络钓鱼发布警告

热门文章

  1. SAP CAP 编程模型简介
  2. yarn install 遇到的错误消息 - Error EPERM operation not permitted, open .yarnrc
  3. SAP Spartacus pageSlot一览
  4. Angular karma test.ts里一些标准api用console.log打印出的输出
  5. 不到200行代码实现一个不断旋转的椭圆动画效果
  6. SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
  7. OPA 7 - opaTest
  8. SAP云平台上的ABAP编程环境里如何消费第三方服务
  9. SAP OData etag flag setting in metadata MPC_EXT
  10. ManagedObject this[oPropertyInfo._sMutator](oValue);