类的封装性和继承

面向对象思想已经存在了好多年了,PHP之前没有面向对象,是PHP开发者后期加上的。
面向对象思想有三大特征,封装,继承,多态,其中多态并不适用于PHP。
之前使用的是public关键词,它的意思是公开的,意思就是只要拿到这个类,谁都可以使
用,谁都可以赋值调用,重新赋值调用。
封装:即禁止某些方法/属性 ,不充许外部调用。并开放部分方法 ,来间接调用。
比如 银行的 ATM, 你可以输入密码 " 检测 " 用户的密码是否正确, 但不能 " 查询 " 用户的密码。
代码 :

 1 class ATM{
 2   //protected 受保护的,只允许本类内部使用,外部方法调用。设置了外部无法访问的权
 3 限。
 4   protected function getPass(){
 5   return ‘123456‘;
 6   } public function checkPass($pass){
 7   return $pass == $this->getPass();
 8   }}$atm = new ATM();
 9 $atm = checkPass(‘1234456‘);
10 $atm->getPass(); //出错

以上如果用面向过程的函数来开发,则比较难实现屏蔽的功能。
以上是方法的封装,设置关键词protected关键词,受保护的,可以有效防止外部调用,但内部又可
以使用的策略,同样的方法适用于属性。

 1 <?php
 2   //面向对象的封装
 3   //public private
 4
 5   class A{
 6  public $name = ‘加州‘;
 7   //只能在自己和家族范围访问 不能在外部范围访问
 8   protected $sex = ‘郑州‘;
 9   public function test(){
10   echo $this->sex;
11   } } $p = new A;
12   //可以输出,因为是public公开的。
13   echo $p->name;
14   //不能输出,设置了protected受保护的,外部方法调用。
15   //echo $p->sex;
16   //但如果我就想输出怎么办?
17   //可以利用test方法,因为test方法属于A类,让test本类中的方法去调用本类的属性。
18   $p->test();

以上我们总结一下:
public 公开的,类内部,外部均可调用。
protected 受保护的,内部可调用,外部无法调用。
另外还有一种,private 私有的,除了自己其他都无法访问

网上有人给我们提供了 一个MySQL 类 , 我们可以直接new使用。
但我如果觉得这个类的某个方法不好 , 或者缺少某个方法 , 怎么办?

类继承的语法:

 1 class A{
 2   public function youQian(){
 3   echo "老子有钱";
 4  }
 5 }//使用extends关键词继承。
 6 // class 子类(用户定义的) extends 父类(现有的类){}
 7 class Aa extends A{
 8   public function qiong(){
 9   echo "我是真的穷";
10   }
11 }//子类继承父类以后,父类的方法可直接使用。
12 $erzi = new Aa();
13 $erzi->youQain();
14 $erzi->qiong();

如果重名会怎么样?

 1 class A{
 2   public function youQian(){
 3   echo "老子有钱";
 4   }
 5 }//使用extends关键词继承。
 6 // class 子类(用户定义的) extends 父类(现有的类){}
 7 class Aa extends A{
 8   public function youQian(){
 9   echo "我比你更有钱";
10   }
11 }//子类继承父类以后,父类的方法可直接使用。
12 $erzi = new Aa();
13 //如果重名,会直接输出子类的方法,这在PHP面向对象中叫覆盖重写。
14 $erzi->youQain();

所以,看需求,你觉得原来的类中,有个方法不好用,可以继承以后重写,有人问,那我直接在原
基础的类上直接修改不行吗?干嘛还要继承以后再重写?

class A{
  public function youQian(){
  echo "老子有钱";
  }

 public function benShi(){
  echo "老子不光有钱,本事才是最重要的";
  }
}//使用extends关键词继承。
// class 子类(用户定义的) extends 父类(现有的类){}
class Aa extends A{
  public function youQian(){
  echo "我?你更有钱";
  }
}/*
注意:虽然我们觉得A类中,youQian()这个方法不太好,我希望重写,但一个类中不只有一个
类,还有大量的其他的方法,这些?法我觉得都很好,所以我想既要留着其他的方法供我使用,我
还想重写youqian这个方法。
*/
//子类继承父类以后,父类的方法可直接使用。
$erzi = new Aa();
//如果重名,会直接输出子类的方法,这在PHP面向对象中叫覆盖重写。
$erzi->youQain();

不仅如此,继承以后,还可以在?类中继续新增方法,在原有的基础上,可以无限扩充你想要的功
能:

 1 class A{
 2  public function youQian(){
 3  echo "有钱";
 4  }
 5
 6  public function benShi(){
 7  echo "不光有钱,本事才是最重要的";
 8  }
 9 }
10 //使用extends关键词继承。
11 // class 子类(用户定义的) extends 父类(现有的类){}
12 class Aa extends A{
13  public function youQian(){
14  echo "我比你更有钱";
15  }
16
17  public function genBenShi(){
18  echo "我比老爷子更有本事";
19  }
20 }/*
21 注意:虽然我们觉得A类中,youQian()这个?法不太好,我希望重写,但一个类中不只有一个
22 类,还有大量的其他的方法,这些方法我觉得都很好,所以我想既要留着其他的方法供我使用,我
23 还想重写youqian这个方法。
24 */
25 //子类继承父类以后,父类的方法可直接使用。
26 $erzi = new Aa();
27 //如果重名,会直接输出子类的方法,这在PHP面向对象中叫覆盖重写。
28 $erzi->youQain();
29 //调用自己写的方法
30 $erzi->genBenshi();

继承的好处:
子类可以继承父类的属性及方法 , 并允许覆盖父类的方法或新增方法
通过自然界的比喻就是,通过"进化"来获得新特性,同时不影响旧物种。

注意:
PHP的继承是单继承。
一个子类只能继承一个父类。
但可以形成孙子继承。

 1 <?php
 2 class A{
 3
 4 }
 5 class B{
 6 }
 7 class C extends A{
 8
 9
10 }
11 class C extends B{
12 }
13 //PHP是单继承,一个子类只能继承一个父类,不能有两个爹。
14 $aa = new C();

形成孙子继承:

 1 <?php
 2   //自类继承父类中的所有内容
 3
 4   class A{
 5   public function sayA(){
 6   echo $this->name;
 7   } } //不仅仅是可以向下 也可以向上
 8   class B extends A{
 9   // A 里面的sayA C里面的sayC 这两个方法都可以访问B类里面的受保护的属 protected $name =‘满身大汉‘;
10   } class C extends B{
11   public function sayC(){
12   echo $this->name;
13   } } $p = new C;
14  $p->sayC();
15   $p->sayA();

不仅如此,PHP的继承还可以有多个儿子。

 1 <?php
 2 class A{
 3
 4 }
 5 class C extends A{
 6
 7
 8 }
 9 class D extends A{
10 }
11 //PHP是单继承,但可以有多个儿子。
12 $aa = new C();

原文地址:https://www.cnblogs.com/zhony/p/10246408.html

时间: 2024-11-05 18:56:23

类的封装性和继承的相关文章

2019-07-23 类的封装性

类的封装性,简单来说就是在属性和方法前加了一个限定词,在php中有三个限定词:public(公共的).protected(被保护的).private(私有的),如果属性前加了任何一个限制词var要省略.它们具体有什么区别呢?它们的关系又是什么呢?下面做一个解析. 首先来看一个表格:     public protected private 类中 可以被访问 可以被访问 可以被访问 类外 可以被访问     子类 可以被访问 可以被访问   上面的表格已经可以让我们对这三个属性做一个清楚地认知,下

转载 实现类的封装性

实现类的封装性 为了实现良好的封装性,我们通常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问.对一个变量的操作,一般都有读取和赋值操作,我们分别定义两个方法来实现这两种操作,一个是getXxx()(Xxx表示要访问的成员变量的名字),用来读取这个成员变量操作,另外一个是setXxx()用来对这个成员变量赋值.一个类通常就是一个小的模块,我们应该让模块仅仅公开必须要让外界知道的内容,而隐藏其它一切内容.我们在进行程序的详细设计时,应尽量避免一个模块直接修改或操作另

类的封装性和信息隐蔽—类声明和成员函数定义的分离

在面向对象的程序开发中,一般做法是将类的声明(其中包含成员函数的声明)放在指定的头文件中,用户如果想用该类,只要把有关的头文件包含进来即可,不必在程序中重复书写类的声明,以减少工作量,节省篇幅,提高编程的效率. 由于在头文件中包含了类的声明,因此在程序中就可以用该类来定义对象.由于在类体中包含了对成员函数的声明,在程序中就可以调用这些对象的公用成员函数.为了实现上一节所叙述的信息隐蔽,对类成员函数的定义一般不放在头文件中,而另外放在一个文件中. 例如,可以分别写两个文件: //student.h

Java——类的封装、继承与多态

一.类和对象 1.类 类是数据以及对数据的一组操作的封装体. 类声明的格式: 类声明 { 成员变量的声明: 成员方法的声明及实现: } 1.1 声明类 [修饰符] class 类<泛型> [extends 父类] [implements 接口列表] <泛型>——类的参数,带有参数的类成为泛型类. 1.2 声明成员变量和成员方法 成员变量声明格式:[修饰符] 数据类型 变量[=表达式]{,变量[=表达式]}: 成员方法——用来描述对成员变量进行的操作,格式:[修饰符] 返回值类型 方

java面向对象基础 封装性

对于刚学习java的人来说可能不知道 封装性的好处,感觉麻烦,封装有很多好处.最主要的目的就是 保护内容.保证某些属性或者方法不被外部看见. 类的封装性即不能让外面的类随意修改一个类的成员变量: 在定义一个类的成员(包括变量和方法),使用private关键字说明这个成员的访问权限,只能被这个类的其他成员方法调用,而不能被其他的类中的方法所调用: 为实现封装性,常将类的成员变量声明为private,再通过public的方法来对这个变量进行访问.对一个变量的操作,一般都有 读取和赋值操作,我们一般定

vb.net和C#两兄弟谁的封装性更好?

引言: 虽然没怎样接触过vb.net,但是大概对于vb6还是比较了解的.前者是从后者基础上发展而来的.后来接触了C#编程语言,起初没有太关心她和vb.net有啥不同的地方,话说都是面向对象的,而且都是MS帝国的产品.一直觉得没什么区别,直到昨天的下午……我才发现这样一个吊炸天的问题……原来vb.net她……竟然…… 最近看一些博客发现,也发一些vb6.0论坛,vb.net论坛等比较冷清,更多的人从过去的vb6.0和vb.net选择转向了C#……刚好也和我昨天的发现不谋而合. 下面是我的一点小小的

Python 基础之面向对象初识与类的封装

一: 面向对象类的初识#(1) 类的定义#三种方式:#1.class MyClass:    pass #2.推荐class MyClass():    pass #3.class MyClass(object):    pass#(2) 类的实例化class MyClass():    pass#类的实例化,实例化对象obj = MyClass() #obj 就是一个对象#(3)类的基本结构只有成员方法和成员属性对象.属性  对象.方法()#例:class MyClass():    #成员属

php类的封装、继承和多态的简单理解

.面象对向的三大特点:封装性.继承性.多态性 首先简单理解一下抽象: 我们在前面定义一个类的时候,实际上就是把一类事物共有的属性和行为提取出来,形成一个物理模型(模版),这种研究问题的方法称为抽象 一.封装性  封装就是把抽取出来的数据和对数据的操作封装在一起,数据被保护在内部,程序的其他部分只有被授权的操作(方法)才能对数据进行操作.  php提供了三种访问控制修饰符  public 表示全局,本类内部,类外部,子类都可以访问  protected 表示受保护的,只有本类或子类可以访问  pr

黑马程序员--oc 类的封装 继承 和多态

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 成员变量的命名规范: 成员变量名要以 _开头 作用: 1.可以让成员变量和get方法的名称区分开 2.可以和局部变量区分开,一看到以_开头的变量一般都是成员变量 封装: 在定义成员变量时,尽量不要用@public 这种写法 ,而是使用set方法和get方法 @interface Student : NSObject { int _age; } /* set方法: 作用:提供一个方法给外界设置成