php多态性和继承是什么意思,封装 继承 多态的区别
一、封装性封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作。
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.封装 2.多态 3.类的约束 4. super()深入了解 前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个 ...
- 04 面向对象之:三大特性:继承(已讲),封装,多态。
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- 面向对象封装继承多态五大基本原则魔法方法反射
目录 面向对象 三大基本特征 五大基本原则 魔法方法 反射 面向对象 什么是面向对象 使用模板的思想,将世界万事万物使用对象来表示一个类型 面向对象和面向过程的区别: 面向对象的不就是使用程序处理事情 ...
- python封装继承多态_浅谈JavaScript的面向对象和它的封装、继承、多态
写在前面 既然是浅谈,就不会从原理上深度分析,只是帮助我们更好地理解... 面向对象与面向过程 面向对象和面向过程是两种不同的编程思想,刚开始接触编程的时候,我们大都是从面向过程起步的,毕竟像我一样, ...
- 对C++继承,封装,多态的理解
用了C++一段时间,感觉对C++慢慢有了一点认识,在这和大家分享一下. C++是一款面向对象的语言,拥有面向对象语言的三大核心特性:继承,封装,多态.每一个特性的良好理解与使用都会为我们的编程带来莫大 ...
- C#里封装 继承 多态(包教包会)
一.封装 C#中可使用类来达到数据封装的效果,这样可以使数据与方法封装成单一元素,以便于通过方法存取数据.除此之外,还可以控制数据的存取方式. 在面向对象编程中,大多数都是以类作为数据封装的基本单位. ...
- 04 面向对象之:三大特性:继承,封装,多态
前言: Python面向对象的三大特性:继承,封装,多态 1.封装:把很多数据封装到一个对象中,把固定功能的代码封装到一个代码块,函数,对象,打包成模块.这都属于封装的思想.具体的情况具体分析,比如, ...
- Python面向对象之:三大特性:继承,封装,多态以及类的约束
前言: python面向对象的三大特性:继承,封装,多态. 1. 封装: 把很多数据封装到⼀个对象中. 把固定功能的代码封装到⼀个代码块, 函数, 对象, 打包成模块. 这都属于封装的思想. 具体的情 ...
- 小白理解——封装继承多态
一.封装 是什么:首先是抽象,把事物抽象成一个类,其次才是封装.对外表示为一个对象,隐藏对象的属性和动作实现的细节,仅对外公开接口. ...
最新文章
- 95后实习生的远程办公体验(asp.net mvc\C#技术栈)
- Vue 脚手架结合 SpringBoot 构建前后端分离入门项目(实现增删改查)
- 服务器 设置 将 Tomcat 注册 到系统服务 及使用方法
- Effective java 第二章 对象 (2)
- HDU1847 博弈论 水题
- 解决THINKCMF后台文章的相册图集只能上传一个图片的问题
- 自定义Dialog的小实战——根据地区选择手机号码前缀
- 语义分割CCNet-Criss Cross Network论文中注意力机制Criss Cross Attention模块的tensorflow代码实现
- c语言快捷键的使用方法,电脑快捷键的使用方法
- 微信小程序——云开发|计费方式调整大家怎么看?
- redis知识盘点【陆】_客户端Jedis
- “分享到微信”的官方SDK和文档中的坑。。。
- [ubuntn]常用软件安装方法
- 区块链经济:机构加密经济学的初学者指南
- windows系统切换用户(通过cmd切换用户)
- 单位冲激信号 matlab,matlab单位冲激序列
- PKCS1_SignatureScheme_PSS
- 18V转12V的芯片,PW2312的BOM和DEMO文件
- 接口保护,element-ui+axios使用加密,后端php-laravel解密
- FBI针对HTTPS网络钓鱼发布警告
热门文章
- SAP CAP 编程模型简介
- yarn install 遇到的错误消息 - Error EPERM operation not permitted, open .yarnrc
- SAP Spartacus pageSlot一览
- Angular karma test.ts里一些标准api用console.log打印出的输出
- 不到200行代码实现一个不断旋转的椭圆动画效果
- SAP SRM ABAP Webdynpro和CFCA usb key集成的一个原型开发
- OPA 7 - opaTest
- SAP云平台上的ABAP编程环境里如何消费第三方服务
- SAP OData etag flag setting in metadata MPC_EXT
- ManagedObject this[oPropertyInfo._sMutator](oValue);