一、封装(访问控制)

  就是将属性私有,并提供公有的setter放置与getter取值方法
注:封装是进行访问控制,不是拒绝访问
             public(公有)    protected(受保护)    private(私有)
      ===========================================================
       在本类中      Y               Y                   Y
       在子类中      Y               Y                   N
       在类外边      Y               N                   N

使用private关键字修饰就是实现了对成员的私有封装。封装后的成员在对象的外部不能直接访问,只能在对象的内部方法中使用 $this访问

1、设置私有属性

<?php
class info {
private $name;
private $sex;
private $age; public function __construct($name="SQYY", $sex="男",$age="1") {
$this->name = $name;
$this->sex = $sex;
$this->age = $age;
}
//在类中声明一个走路的方法,调用两个内部的私有方法完成
function run() {
echo $this ->name .'在走路时' .$this ->leftLeg() .'再' .$this ->rightLeg().'<br>';
}
//声明一个迈左腿的方法,被封装,所以只能内部使用
private function leftLeg() {
return "迈左腿";
}
//声明一个迈右腿的方法,被封装,所以只能内部使用
private function rightLeg() {
return "迈左腿";
}
//实例化一个对象
$person1 = new info();
$person1 -> run(); //run没有被封装,可以在外部调用使用
$person1 -> name='李四'; //name属性被封装,不能再对象外部给私有属性赋值
$person1 -> leftLeg(); //leftLeg()方法被封装,不能在对象外面调用对象的私有方法
}
?>

2、私有成员的访问

<?php
class Person {
public $name; //第一个成员属性$name定义人的名字,此属性被封装
private $sex; //第二个成员属性$sex定义人的性别,此属性被封装
function __construct($name='SQYY',$sex='男'){
$this->name=$name;
$this->sex=$sex;
}
public function setName($name ) { //通过此方法设置属性name的值
$this->name=$name; //为对象的私有属性赋值
}
public function getName(){ //通过此方法获取属性name的值
return $this->name; //返回当前的私有名字属性
}
public function setSex($sex) { //通过此方法设置属性sex的值
if($sex=="男" || $sex=="女") //如果传入合法的值才为私有的属性赋值
$this->sex=$sex; //条件成立则将参数传入的值赋给私有属性
}
public function getSex(){ //通过此方法获取属性$sex的值
return $this->sex; //返回当前的私有性别属性
}
public function info(){
echo '我的名字:' .$this -> name. ',我的性别:' .$this ->sex;
}
}
$person1 = new Person('张三','女');
$person1 ->info(); //输出 我的名字:张三,我的性别:女
?

如果没有使用private封装的成员属性,则可以随意被赋值。如果对私有的成员属性通过公有的方法访问,则可以在公有的方法加一些限制条件来达到封装的目的。

二、继承

  继承的使用场景:当别人有  自己没有  去继承那个人的
      继承的格式: class A extends B{}
      当A类去继承了B类之后  A类中就拥有了B类中所有的成员属性和 成员方法,但是 除了私有成员之外
            访问权限          public   protected   private
            在类的外部         OK         NO           NO
            在子类中            OK         OK           NO

1、继承属性(父类的私有成员只能在本类使用,子类不能访问)

<?php
//声明一个类作为父类使用,将他的成员都声明为私有的
class Myclass{
public $var1 = 100; //声明一个私有的成员属性并赋值100
//声明一个成员方法,使用private关键字设置为私有
public function printHello(){
echo 'Hello<br>';
}
}
//声明一个子类Myclass类的子类师试图访问父类中的私有成员
class Myclass2 extends Myclass{
function useProperty(){
echo '输出从父类及成果来的成员属性值' .$this ->var1 .'<br>'; //访问父类中的私有属性
$this -> printHello(); //访问父类中的私有方法
}
}
$subObj = new Myclass2;
$subObj -> useProperty();
?>

2、单继承

  PHP只支持单继承,不允许多重继承。一个子类只能有一个父类,但一个类可以被多个类继承。

  如类B 继承了类A,类C又继承了类B,那么类C也间接继承了类A

<?php
class P_H_P extends J_A_V_A{
public function php(){
echo "我正在编写php程序";
}
}
class J_A_V_A{
public function java(){
echo "我正编写java程序";
}
}
// 学生的类
class stu extends P_H_P{
}
// 实例化对象
$stus = new stu();
$stus->php();
$stus->java();
?>

3、子类中重载父类的方法
   如果在子类中拥有一个和父类中同名的成员方法时,调用该方法 调用的是子类的成员方法  而不是父类中的
       调用父类中被覆盖的成员方法: parent::方法名

<?php
header('Content-type:text/html;charset=utf-8');
// 调用父类中的成员
//定义一个wifi
define('WIFI',false);
//父类
class Phone{
//成员属性
public $brand = "普通手机";
//成员方法
public function call(){
echo "我正在打电话呢";
}
}
//子类
class SmartPhone extends Phone{
//成员属性
public $brand = "智能手机";
// 成员方法
public function call(){
if(WIFI){
echo "我正在使用wifi打电话呢";
}else{
// 调用父类的方法
parent::call();
echo '怎么了?';
}
}
}
// 实例化对象
$xm = new SmartPhone();
$xm->call();
?>

当定义的WIFI为false时  输出 我正在打电话呢怎么了?

当第义的WIFI为true时   输出 我正在使用wifi打电话呢

【代码学习】PHP面向对象之封装与继承的更多相关文章

  1. python学习day19 面向对象(一)封装/多态/继承

    面向对象 封装思想:将同一类的函数函数封装到同一个py文件中,方便调用 面向对象也有封装的作用,将同一类的函数封装到一个类中 多态(鸭子模型):多种类型/多种形态 #,什么事鸭子模型 对于一个函数,p ...

  2. python面向对象编程 -- 封装、继承

    面向对象编程 -- 封装.继承 面向对象编程三要素:封装.继承和多态.本文主要看和封装.继承相关的概念:在python中多态的概念比较模糊,本文不做讨论. 1 封装 封装:将数据和操作组装到一起,对外 ...

  3. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  4. python面向对象(封装、继承、多态)+ 面向对象小栗子

    大家好,下面我说一下我对面向对象的理解,不会讲的很详细,因为有很多人的博客都把他写的很详细了,所以,我尽可能简单的通过一些代码让初学者可以理解面向对象及他的三个要素. 摘要:1.首先介绍一下面向对象 ...

  5. Java 面向对象,封装,继承

    1相关概念的理解 1.1面向过程.面向对象 面向过程与面向对象都是编程中,编写程序的一种思维方式. 面向过程的程序设计方式,是遇到一件事时,思考“我该怎么做”,然后一步步实现的过程.(职员思想) 面向 ...

  6. 2、C#面向对象:封装、继承、多态、String、集合、文件(上)

    面向对象封装 一.面向对象概念 面向过程:面向的是完成一件事情的过程,强调的是完成这件事情的动作. 面向对象:找个对象帮你完成这件事情. 二.面向对象封装 把方法进行封装,隐藏实现细节,外部直接调用. ...

  7. JavaScript 定义类的最佳写法——完整支持面向对象(封装、继承、多态),兼容所有浏览器,支持用JSDuck生成文档

    作者: zyl910 [TOC] 一.缘由 由于在ES6之前,JavaScript中没有定义类(class)语法.导致大家用各种五花八门的办法来定义类,代码风格不统一.而且对于模拟面向对象的三大支柱& ...

  8. python学习 day23 面向对象三大特性之继承

    ### 面向对象三大特性值继承#### 1.什么是继承 继承是一种关系,必须存在两个对象才可能产生这种关系,在现实生活中的继承,王思聪可以继承王健林的财产 被继承的成为父,继承的一方成为子 在程序中, ...

  9. AJPFX关于面向对象之封装,继承,多态 (上)

    Java是一种面向对象的语言,这是大家都知道的,他与那些像c语言等面向过程语言不同的是它本身所具有的面向对象的特性--封装,继承,多态,这也就是传说中的面向对象三大特性 一:从类和对象开始说起: Oo ...

  10. Js 面向对象之封装,继承,原型,原型链

    封装 ,继承 ,原型, 原型链 封装 ? 面向对象有三大特性,封装.继承和多态.对于ES5来说,没有class(类)的概念,并且由于JS的函数级作用域(函数内部的变量在函数外访问不到),所以我们就可以 ...

随机推荐

  1. LTE引理——解决数论竞赛题的利器

    LTE (Lifting The Exponent Lemma)引理是一个解指数型不定方程的强力工具.它在Olympiad folklore非常知名,虽然它的起源已经无从查找了.它和Hensel’s ...

  2. Verilog 编写规范

    在学习Python时,作者有一句话对我影响很大.作者希望我们在学习编写程序的时候注意一些业内约定的规范.在内行人眼中,你的编写格式,就已经暴露了你的程度.学习verilog也是一样的道理,一段好的ve ...

  3. 一个实例 ---灵活使用jquery选择器实现input一个key,多个value 。 用ajax传递对象到后台控制器

    标题可能不是很清晰,我们看实例: 简单来说就是需要实现sku的功能...一件商品可以有多个属性, 一个属性可以有多个值  . 最后以json格式存到数据库 难点一: 如何实现input输入框的弹性使用 ...

  4. 【Thinkphp】记录一次分页的实现

    thinkphp分页非常简单 1,控制器渲染数据: $studentList = StudentDb::paginate(5); $this->view->assign('list',$s ...

  5. .NTE Core Web API Example

    Source from :https://www.codeproject.com/Articles/1260600/Speed-up-ASP-NET-Core-WEB-API-application- ...

  6. Redis05——Redis五大数据类型 String

    String String是Redis最基本的数据类型(较常用),一个key对应一个value string类型是二进制安全的,Redis的string可以包含任何数据 一个Redis中字符串valu ...

  7. C#中DataSet、SqlDataAdapter的使用-关于数据库操作

    本文链接:https://blog.csdn.net/xubaifu1997/article/details/51816785 DataSet 表示数据在内存中的缓存. 我的理解是,在内存中的数据表, ...

  8. 最小生成树计数 模板 hdu 4408

    题意是给定n个点,m条边的无向图,求最小生成树的个数对p取模. 用kruscal计算最小生成树时,每次取连接了两个不同联通块的最小的边.也就是先处理d1条c1长度的边,再处理d2条c2长度的边.长度相 ...

  9. Nuxt的路由动画效果

    Nuxt.js提供两种方法为路由提供动画效果,一种是全局的,一种是针对单独页面的 全局动画默认使用page来进行设置,例如现在我们为每个页面都设置一个进入和退出时的渐隐渐现的效果.我们可以先在根目录的 ...

  10. java获取配置文件中变量值

    在resources 目录下新建config.properties文件 #文件保存路径 filePath=E:\\images\\file 工具类 public class ConfigUtil { ...