php的封装和继承

一、封装

封装就是有选择性的提供数据
通过访问修饰符来实现封装

1.1 构造方法

构造方法也叫构造函数,当实例化对象的时候自动执行。php中构造函数中不允许使用return。使用了也没效果。
语法:

function __construct() {

}

例:

<?php
    class Student {
        public function __construct() {
            echo '这是构造方法<br/>';
        }
    }
    
    $stu1 = new Student;
?>

效果:
在这里插入图片描述
利用构造方法进行私有变量的赋值访问:

<?php
    class Student {
        private $name;
        private $sex;
        // 初始化成员变量
        public function __construct($name,$sex) {
            $this->name=$name;
            $this->sex=$sex;
        }

        // 显示信息
        public function show() {
            echo "姓名:{$this->name}<br/>";
            echo "性别:{$this->sex}<br/>";
        }
    }
    
    // 实例化
    $stu = new Student('Jack', '男');
    $stu->show();

?>

效果:
在这里插入图片描述

1.2 析构方法

当对象销毁的时候自动调用。(析构方法不能带参数)
语法:

function __destruct() {
 }

代码:

<?php
    class Student {
        private $name;
        // 初始化成员变量
        public function __construct($name) {
            $this->name=$name;
            echo "{$name} 生成。<br/>";
        }

        // 显示信息
        public function __destruct() {
            echo "{$this->name} 销毁。<br/>";
        }
    }
    
    // 实例化
    $stu = new Student('Jack');


?>

效果:
在这里插入图片描述

1.3 计算机的内存管理

计算机内存管理方式:
1、先进先出:
先进先出的内存管理方式一般用在业务逻辑中,比如秒杀、购票等等。

2、先进后出。
先进后出是计算机的默认内存管理方式

二、继承

2.1 继承介绍

  1. 继承使得代码具有层次结构
  2. 子类继承了父类的属性和方法,实现了代码的可重用性
  3. 使用extends关键字实现继承
  4. 父类和子类是相对的

语法:

class 子类 extends 父类 {
}

例题:

<?php
// 父类
class Person {
    public function show () {
        echo '我是人类<br/>';
    }
}

// 子类
class Student extends Person {

}

// 测试
$stu = new Student;
$stu->show();

效果:
在这里插入图片描述
执行过程:

  1. 在Student类中查找show(),如果找到就调用,找不到就到父类中查找
  2. 在Person类中查询show()

2.2 子类中调用父类成员

例:

<?php
// 父类
class Person {
    public function show () {
        echo '我是renlei<br/>';
    }
}

// 子类
class Student extends Person {
    public function test () {
        /* 方法一:
        $person = new Person();
        $person->show();
        */
        // 方法二:
        $this->show();
    }
}

// 测试
$stu = new Student;
$stu->test();

效果:
在这里插入图片描述
小结:
1、方法一:通过实例化父类调用父类的成员
2、方法二:通过$this关键字去调用父类的成员

2.3 访问修饰符protected

protected: 受保护的,在整个继承链上使用,访问。
例题一:

<?php
// 父类
class Person {
    protected $num=10;
}

class Student extends Person {
    public function getNum() {
        echo $this->num;
    }
}

// 测试
$obj = new Student();
$obj->getNum();

效果:
在这里插入图片描述
例题二:

<?php
// 父类
class Person {
    public function getNum() {
        echo $this->num;
    }
}

class Student extends Person {
    protected $num=10;
}

// 测试
$obj = new Student();
$obj->getNum();

效果:
在这里插入图片描述

2.4 继承中的构造函数

规则:如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造数。

通过类名调用父类的构造函数:
类名 __construct()

例题:

<?php
// 父类
class Person {
    public function __construct() {
        echo '这是父类';
    }
}

class Student extends Person {
    public function __construct() {
        echo '这是子类';
    }
}

// 测试
new Student();

效果:
在这里插入图片描述


例题:

<?php
// 父类
class Person {
    public function __construct() {
        echo '这是父类';
    }
}

class Student extends Person {
    // public function __construct() {
    //     echo '这是子类';
    // }
}

// 测试
new Student();

效果:
在这里插入图片描述


通过类名调用父类的构造函数:
类名 __construct()

<?php
// 父类
class Person {
    public function __construct() {
        echo '这是父类';
    }
}

class Student extends Person {
    public function __construct() {
        Person::__construct(); // 调用父类的构造函数
        echo '这是子类';
    }
}

// 测试
new Student();

效果:
在这里插入图片描述


但是这种耦合性高,我们需要解耦,可以使用parent关键字代表这个子类的父类:

<?php
// 父类
class Person {
    public function __construct() {
        echo '这是父类';
    }
}

class Student extends Person {
    public function __construct() {
        parent::__construct(); // 调用父类的构造函数
        echo '这是子类';
    }
}

// 测试
new Student();

效果:
在这里插入图片描述


例题:给父类传递参数:

<?php
// 父类
class Person {
    protected $name;
    protected $sex;
    public function __construct($name, $sex) {
        $this->name=$name;
        $this->sex=$sex;
    }
}

class Student extends Person {
    private $score;
    public function __construct($name, $sex, $score) {
        parent::__construct($name, $sex); // 调用父类的构造函数并传递参数
        $this->score=$score;
    }
    public function getInfo() {
        echo "姓名: {$this->name}<br/>";
        echo "性别: {$this->sex}<br/>";
        echo "成绩: {$this->score}<br/>";
    }
}

// 测试
$stu = new Student('Jack', '男', 18);
$stu->getInfo();

效果:
在这里插入图片描述

2.5 多重继承

PHP不允许多重继承,因为多重继承容易产生二义性。

2.6 $this详解

$this表示当前对象的引用。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值