1 面向对象介绍

1.1 介绍

​ 面向对象是一个编思想. 编程思想有面向过程和面向对象.

​ 面向过程: 编程思路集中的是过程上

​ 面向对象: 编程思路集中在参与的对象

1.2 好处

  1. 多人合作方便

  2. 减少代码冗余, 灵活性高

  3. 代码的可用性发挥到极致

  4. 可扩展性强

    OOP: 面向对象编程
    OOA: 面向对象分析
    OOD: 面向对象设计 

1.2 类和对象

​ 1. 对象是具体存在的事物,对象是由属性(变量)和(方法)组成的

​ 2. 类是具体相同属性和行为的一组对象的集合

​ 在开发的时候,先写类, 通过类创建对象, 通过对象调用方法和属性

​ 一个类可以创建多个对象

2 在PHP中实现类和对象

2.1 创建类

class 类名{
//属性
//方法
//常量
}
类是由属性,方法,常量组成的
_________________________________________________________________________
<?php
calss Student {
};
?>

命名规则

  1. 以字母, 下划线开头, 后面跟的是字母, 数字, 下划线

    1. 不能用PHP关键字做类名

      1. 类名不区分大小写 (变量名区分, 关键字,类名不区分带小写). 类名用帕斯卡命名法 (大驼峰, 首字母大写)

2.2 对象实例化

​ 通过new关键字来实例化对象

<?php
// 定义类
class Student{
}
//实例化
$stu1=new Student();
// 小括号可以省略
$stu2=new Student;

2.3 对象的比较

对象的传递是地址传递

​ 相等: 结构和保存的值一样就相等

​ 全等: 指向同一个对象才是全等

<?php
class Stu{

}
$stu1=new Stu;
$stu2=new Stu;
// 对象传递的是地址
$stu3=$stu2;

//true
var_dump($stu1==$stu2);
//false
var_dump($stu1===$stu2);
//true
var_dump($stu2===$stu3);

3 属性 & 方法 & 修饰符

3.1 属性

​ 属性本质就是变量

​ 通过->调用对象的成员 对象名 -> 属性名 对象名 -> 方法名()

<?php
// 定义类
class Stu {
public $name;
public $add='地址不详';
}
// 实例化对象
$stu=new Stu;
$stu->name='Tom';
$stu->add='北京';
// 获取属性的值
echo '姓名:'.$stu->name,'<br>';
echo '地址:'.$stu->add,'<br>';
// 添加属性
$stu->age=20;
echo '年龄:'.$stu->age,'<br>';
//删除属性
unset($stu->add);
print_r($stu);
?>

3.2 方法
​ 方法的本质就是函数

<?php
// 定义类
class Stu{
public function show() {
echo '这是show方法<br>';
}
function test(){
echo '这是test方法<br>';
}
}
// 调用方法
$stu=new Stu;
$stu->show();
$stu->test();
?>
  1. 方法前面的public是可以省略的, 如果省略, 默认是public

    1. 属性前面的public不能省略

3.3 修饰符

​ 用来控制成员的访问权限

修饰符 描述
public (公有的) 在类的内部和外部都能访问
private (私有的) 只能在类的内部访问
protected (受保护的) 在整个继承链上访问

​ 一般来说,属性都用私有的,通过公有的方法对私有的属性进行赋值和取值

​ 作用: 保证数据的合法性

<?php
class Stu{
private $name;
private $sex;
function setInfo($name,$sex){
if($sex!='男'&&$sex!='女'){
echo '性别必须为男或女';
exit;
}
$this->name=$name;
$this->sex=$sex;
}
function getInfo(){
echo '姓名: '.$this->name,'<br>';
echo '性别: '.$this->sex,'<br>';
}
}
$stu=new Stu;
$stu->setInfo('tom','男');
$stu->getInfo();
echo '<hr>';
$stu1=new Stu;
$stu->setInfo('Sunny','难啊难');
$stu->getInfo();
?>

4 类和对象在内存中的分布

4.1 分布

  1. 对象的本质是一个复杂的变量

    1. 类的本质是一个自定义的复杂数据类型

      1. 展区: 运行速度快, 体积小, 保存基本类型

      2. 堆区: 运行速度稍慢, 体积大, 保存复杂类型

      3. 实例化的过程就是分配内存空间的过程

      4. 对象保存在堆区, 将堆区的地址保存到栈区

4.2 计算机的内存管理

​ 计算机内存管理方式: 先进先出, 先进后出

​ 先进先出的内存管理方式一般用在业务逻辑中, 比如秒杀, 购票等等

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

5 构造方法 & 析构方法

5.1 介绍

​ 构造方法也叫构造函数, 当实例化对象的时候自动执行

<?php
// 前面是两个下划线
function __construct(){
}
___________________________________________________________________ class Stu{
function __construct(){
echo '这是构造方法<br>';
}
}
new Stu();
new Stu();
?>

​ 在其它语言中, 与类名同名的函数时构造函数, 在PHP中不允许这种写法

5.2 构造函数作用

​ 初始化成员变量

​ 构造函数可以带参数, 但不能有return

<?php
class Stu{
private $name;
private $sex;
function __construct($name,$sex){
$this->name=$name;
$this->sex=$sex;
}
function show(){
echo "姓名: {$this->name}<br>";
echo "性别: {$this->sex}<br>";
}
}
$stu=new Stu('Wang','男');
$stu->show();
?>

5.3 析构方法

​ 当对象销毁的时候自动调用

​ 析构函数不可以带参数

function __destruct(){
}
______________________________________________________________ <?php
class Stu{
private $name;
function __construct($name){
$this->name=$name;
echo "{$name}出生了<br>";
}
function __destruct(){
echo "{$this->name}销毁了<br>";
}
}
$stu1=new Stu('Tom');
$stu2=new Stu('Wang');
echo '<hr>';
?>

6 继承

6.1介绍

  1. 继承使得代码具有层次结构

    1. 子类继承父类的属性和方法, 实现代码的可重用性

      1. 使用extends关键字实现继承

      2. 父类和子类是相对的

class 子类 extends 父类{
}
____________________________________________________________ <?php
class Person{
function show(){
echo '这是人类<br>';
}
}
// 子类继承父类
class Stu extends Person{
}
$stu=new Stu;
$stu->show();
?>    

执行过程

  1. 在Stu类中查找show(), 如果找到就调用, 找不到就到父类中查找

    1. 在Person类中查询show()

6.2 子类中调用父类成员

 
<?php
class Person{
function show(){
echo '这是人类<br>';
}
}
// 子类
class Stu extends Person{
function test(){
// 方法一
// $person=new Person();
// $person->show(); // 方法二
$this->show();
}
}
$stu=new Stu;
$stu->test();
?>
  1. 通过实例化父类调用父类的成员

  2. 通过$this关键字调用父类的成员

6.3 protected

​ protected: 受保护的, 在整个继承链上使用

// 一
<?php
class A{
protected $num=10;
}
class B extends A {
function getNum(){
echo $this->num;
}
}
$obj=new B();
$obj->getNum();
?>
______________________________________________________________________ //二
<?php
class A {
function getNum(){
echo $this->num;
}
}
class B extends A {
protected $num=10;
}
$obj=new B();
$obj->getNum();
?>
______________________________________________________________________________ //三
<?php
class A {
function getNum(){
echo $this->num;
}
}
class B extends A {
protected $num=10;
}
//整个继承链上只有A
$obj=new A();
//报错: Notice:Undefined property: A::$num
$obj->getNum();
?>

6.4 继承中的构造函数

  1. 如果子类有构造函数就调用子类的, 如果子类没有就调用父类的构造函数

    1. 子类的构造函数调用后, 默认不再调用父类的构造函数

通过类名调用父类的构造函数

 
类名::__construct()
_______________________________________________________________________ <?php
class Person{
public function __construct(){
echo '这是父类<br>';
}
}
class Stu extends Person{
public function __construct(){
Person::__construct();
parent::__construct();
echo '这是子类<br>';
}
}
new Stu();
?>

parent关键字表示父类的名字, 可以降低程序的耦合性

给父类传递参数

<?php
class Person{
protected $name;
protected $sex;
public function __construct($name,$sex){
$this->name=$name;
$this->sex=$sex;
}
}
class Stu 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 Stu('Wang','男',90);
$stu->getInfo();
?>

6.5 $this详解

​ this表示当前对象的引用, 也就是this保存的当前对象的地址

<?php
class A{
public function __construct(){
var_dump($this);
}
}
class B extends A {
}
new A();
echo '<br>';
new B();
?>

6.6 多重继承

​ php不允许多重继承, 因为多次继承容易产生二义性.

​ 如何实现C继承A和B, 使用继承链

PHP面向对象(一)的更多相关文章

  1. angular2系列教程(六)两种pipe:函数式编程与面向对象编程

    今天,我们要讲的是angualr2的pipe这个知识点. 例子

  2. 一起学 Java(二)面向对象

    一.方法函数 函数也称为方法,就是定义在类中的具有特定功能的一段独立代码.用于定义功能,提高代码的复用性. 函数的特点1> 定义函数可以将功能代码进行封装,便于对该功能进行复用:2> 函数 ...

  3. js面向对象学习 - 对象概念及创建对象

    原文地址:js面向对象学习笔记 一.对象概念 对象是什么?对象是“无序属性的集合,其属性可以包括基本值,对象或者函数”.也就是一组名值对的无序集合. 对象的特性(不可直接访问),也就是属性包含两种,数 ...

  4. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  5. .NET 基础 一步步 一幕幕[面向对象之对象和类]

    对象和类 本篇正式进入面向对象的知识点简述: 何为对象,佛曰:一花一世界,一木一浮生,一草一天堂,一叶一如来,一砂一极乐,一方一净土,一笑一尘缘,一念一清静.可见"万物皆对象". ...

  6. 简单分析JavaScript中的面向对象

    初学JavaScript的时候有人会认为JavaScript不是一门面向对象的语言,因为JS是没有类的概念的,但是这并不代表JavaScript没有对象的存在,而且JavaScript也提供了其它的方 ...

  7. Java程序员应该了解的10个面向对象设计原则

    面向对象设计原则: 是OOPS(Object-Oriented Programming System,面向对象的程序设计系统)编程的核心,但大多数Java程序员追逐像Singleton.Decorat ...

  8. JavaScript学习笔记(三)——this、原型、javascript面向对象

    一.this 在JavaScript中this表示:谁调用它,this就是谁. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是一个动态的对象,根据调用的对象不同而发生变化, ...

  9. 带你一分钟理解闭包--js面向对象编程

    上一篇<简单粗暴地理解js原型链--js面向对象编程>没想到能攒到这么多赞,实属意外.分享是个好事情,尤其是分享自己的学习感悟.所以网上关于原型链.闭包.作用域等文章多如牛毛,很多文章写得 ...

  10. .NET基础拾遗(2)面向对象的实现和异常的处理基础

    Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...

随机推荐

  1. hdu 4704 Sum (整数和分解+高速幂+费马小定理降幂)

    题意: 给n(1<n<),求(s1+s2+s3+...+sn)mod(1e9+7). 当中si表示n由i个数相加而成的种数,如n=4,则s1=1,s2=3.                 ...

  2. 让cocos2dx支持并通过arm64 编译

    为了要支持64位,请把这个文件直接替换到相应的lib文件夹下.本来是须要改neton_matrix_impl.c里的宏定义, 在 platform/ios/EAGLVIEW.mm中 在neon_mat ...

  3. MySQL出现Ignoring query to other database的问题

    今天使用mysql的时候,输入随意一条命令都会出: Ignoring query to other database 这条错误信息,非常是奇怪. 后来才发现是登录数据库时.少了个-u的參数.. 正确的 ...

  4. 【NOIP 2011】 计算系数

    [题目链接] https://www.luogu.org/problemnew/show/P1313 [算法] 二项式定理 [代码] #include<bits/stdc++.h> usi ...

  5. Redis位图法记录在线用户的状态

    Redis位图法记录在线用户的状态 位图 Redis官方文档对于位图的介绍如下: 位图不是一个真实的数据类型,而是定义在字符串类型上的面向位的操作的集合.由于字符串类型是二进制安全的二进制大对象,并且 ...

  6. 你要的 React 面试知识点,都在这了

    摘要: 问题很详细,插图很好看. 原文:你要的 React 面试知识点,都在这了 作者:前端小智 Fundebug经授权转载,版权归原作者所有. React是流行的javascript框架之一,在20 ...

  7. Nginx 配置埋点js日志采集

    页面埋点&nginx日志采集 页面(web容器:httpd/nginx负载均衡 + apache server)<===> 日志采集服务器(nginx服务器) 通过某个页面跳转到我 ...

  8. 错误信息:getOutputStream() has already been called for this response

    原因(转): getOutputStream()和getWriter()这两个方法不能在一个请求内同时使用, 如果使用forward,这时将要跳转到的页面是要用getWriter()方法获得输出流把页 ...

  9. RAP、Mock.js、Vue.js、Webpack

    最近做项目使用的是RAP1的接口,但是昨天开始,RAP1 出现了问题,接口都不能用了. 所以补充一下Mock.js的用法,以便在这种突发的情况时候时自己通过Mock的方式来处理接口. npm init ...

  10. Css float 盒子模型 position

    属性: float 浮动 浮动的内容用div包起来,给div设置宽高 clear 清除浮动. box-sizing 标准模式下的盒模型 content-box:(默认属性) padding和borde ...