博客
关于我
PHP面向对象1
阅读量:260 次
发布时间:2019-03-01

本文共 7207 字,大约阅读时间需要 24 分钟。

一、面向对象介绍

1、介绍

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

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

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

以去饭馆吃饭为例:

  • 面向过程:点菜——做菜——上菜——吃饭——结账——收拾

  • 面向对象:服务员,厨师,客人

2、面向对象的好处

  1. 多人合作方便
  2. 减少代码冗余,灵活性高
  3. 代码的可重用性发挥到极致
  4. 可扩展性强
多学一招:OOP:面向对象编程(Object Oriented Programming,面向对象编程)OOA: 面向对象分析(Object-Oriented Analysis,OOA)OOD: 面向对象设计(Object-Oriented Design,OOD)

二、类和对象

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

在这里插入图片描述

2、类是具有相同属性和行为的一组对象的集合

分析:做菜动作-----厨师对象-----厨师类

结论:我们在开发的时候,先写类,通过类创建对象,然后调用对象的属性和方法实现功能

类-----对象-----调用成员

注意:一个类可以创建多个对象

在这里插入图片描述

小结:

1、对象是由属性和方法组成的
2、类是所有对象的相同属性和方法的集合
3、在开发的时候先写类,通过类创建对象,通过对象调用方法和属性
4、一个类可以创建多个对象

三、在php中实现类和对象

1、创建类

语法:

class 类名{   	//属性	//方法	//常量}类是由属性、方法、常量组成的,也可以说类成员有:属性、方法、常量

类名的命名规则:

  1. 以字母、下划线开头,后面跟的是字母、数字、下划线
  2. 不能用PHP关键字做类名
  3. 类名不区分大小写(变量名区分,关键字、类名不区分大小写)
  4. 类名用帕斯卡命名法(大驼峰 单词的首字母大写)

2、对象实例化

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

3、对象的比较

注意:对象的传递是地址传递

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

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

";var_dump($stu1===$stu2);//bool(false) $stu1和$stu2不是同一个对象echo "
";var_dump($stu2===$stu3);//bool(true) $stu2和$stu3是同一个对象

四、属性

属性的本质就是变量

通过->调用对象的成员

对象名->属性名

对象名->方法名()

[add] => 地址不详 )//操作属性//1、给属性赋值$stu->name='tom';$stu->add='北京';//2、获取属性的值echo '姓名:'.$stu->name,'
'; //姓名:tomecho '地址:'.$stu->add,'
'; //地址:北京//3、添加属性$stu->age=20;print_r($stu); //Student Object ( [name] => tom [add] => 北京 [age] => 20 ) echo '
';//4、删除属性unset($stu->add);print_r($stu); //Student Object ( [name] => tom [age] => 20 )

五、方法

方法的本质就是函数

"; } function test(){ echo "这是test方法
"; }}$stu=new Student;$stu->show();$stu->test();
多学一招:1、方法前面public是可以省略的,如果省略,默认就是public的。2、属性前面的public不能省略3、变量写类里面叫属性,并且加public;函数写类里面叫方法,可不加public

六、访问修饰符

用来控制成员的访问权限

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

多学一招:

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

作用:保证数据的合法性,过滤数据

name=$name;//$this表示当前对象 $this->sex=$sex; } //显示信息 public function getInfo(){ echo "性名:".$this->name,"
"; echo "性别:".$this->sex,"
"; }}//实例化$stu=new Student;$stu->setInfo('tom','男');$stu->getInfo();echo '

';$stu2=new Student;$stu2->setInfo('berry','女');$stu2->getInfo();

在这里插入图片描述

$this表示调用当前方法的对象

七、类和对象在内存中的分布

  1. 对象的本质是一个复杂的变量
  2. 类的本质是一个自定义的复杂数据类型
  3. 栈区:运行速度快,体积小,保存基本类型
  4. 堆区:运行速度稍慢,体积大,保存复杂类型
  5. 实例化的过程就是分配内存空间的过程
  6. 对象保存在堆区,将堆区的地址保存到栈区
public $name;	public $sex;	public function show() {   	}}$stu1=new Student;//对象实例化,分配内存的过程$stu2=new Student;var_dump($stu1);//object(Student)#1 (2) { ["name"]=> NULL ["sex"]=> NULL }//显示属性,不显示方法$stu1->show();

在这里插入图片描述

1、栈空间段:

栈的特点是空间小但被CPU访问的速度快,用于存放程序中临时创建的变量。由于栈的先进后出特点,所以栈用来保存和恢复调用现场
我们可以把栈看成一个临时的数据寄存、交换的内存区,用于存储占用空间长度不变并且占用空间小的数据类型的内存段,例如:整型1、100、1000等在内存中占用的空间是等长的,都是32位4字节。此外,double、boolean等类型的数据都可以存储在栈空间段
2、堆空间段
堆用于存放进程中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减,用于存储数据长度或占用内存比较大的数据。例如:字符串、数组和对象就存储在这段内存中
3、初始化数据段
初始化数据段用来存放可执行文件中已初始化的全局变量,换句话说就是存放程序静态分配的变量
4、代码段
代码段用来存放可执行文件的操作指令,也就是说它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,所以只允许读取操作,而不允许写入(修改)操作。例如,程序中的函数就存储在这段内存中


对象类型的数据就是一种占用空间比较大的数据类型,并且是占用的空间不定长的数据类型,所以对象创建完成以后被存放在堆内存中,而堆内存是不可以直接存储的内存,但可以通过对象的引用名称访问对象中的成员

八、封装

封装就是有选择性的提供数据

通过访问修饰符来实现封装

在这里插入图片描述
在这里插入图片描述

私有成员的访问就是在对象的内部声明一些操作私有属性的公有方法

这样,在对象的外部就可以将公有的方法作为访问接口,间接地访问对象内部的私有成员

九、构造方法

1、介绍

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

语法:

function __construct(){   }注意:前面是两个下划线

例题:

'; }}new Student(); //这是构造方法new Student(); //这是构造方法

注意:在其他语言里,与类名同名的函数是构造函数,在PHP中不允许这种写法

class Student {   	//和类名同名的方法是构造方法,PHP中不建议使用	public function Student() {   		echo '这是构造方法
'; }}/*Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; Student has a deprecated constructor in F:\wamp\www\6-demo.php on line 2这是构造方法严格模式不建议这么做*/

构造函数的作用:初始化成员变量

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

在这里插入图片描述

注意:构造函数可以带参数,但不能有return

十、析构方法

1、介绍

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

语法:

function __destruct(){   }

注意:析构函数不可以带参数

例题:

name=$name; echo "{ $name}出生了
"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了
"; }}//测试$stu1=new Student('tom');$stu2=new Student('berry');$stu3=new Student('ketty');echo '

';

在这里插入图片描述

当堆内存段的对象失去访问它的引用时,就不能被访问;了,也就成为垃圾对象

通常对象的引用被赋予其他的值或者是在页面运行结束时,对象都会失去引用
在PHP中有一种垃圾回收的机制,当对象不能被访问时就会自动启动垃圾回收的程序,收回对象在堆中占用的内存空间
而析构方法正是在垃圾回收程序对象之前调用的,通常用来完成一些在对象销毁前的处理任务

//测试$stu1=new Student('tom');$stu1=null;$stu2=new Student('berry');$stu3=new Student('ketty');echo '

';

在这里插入图片描述

2、计算机的内存管理

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

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

在这里插入图片描述

先进后出是计算机的默认内存管理方式,函数也是先进后出

在这里插入图片描述

3、思考题

思考题1

name=$name; echo "{ $name}出生了
"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了
"; }}//测试$stu1=new Student('tom');$stu2=new Student('berry');$stu3=new Student('ketty');unset($stu2);echo '

';/*tom出生了berry出生了ketty出生了berry销毁了ketty销毁了tom销毁了*/

思考题2

name=$name; echo "{ $name}出生了
"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了
"; }}//测试new Student('tom');//没有变量引用的值就是垃圾new Student('berry');new Student('ketty');/*tom出生了tom销毁了berry出生了berry销毁了ketty出生了ketty销毁了*/

思考题3

name=$name; echo "{ $name}出生了
"; } //析构方法 public function __destruct() { echo "{ $this->name}销毁了
"; }}//测试$stu=new Student('tom');$stu=new Student('berry');$stu=new Student('ketty');/*tom出生了berry出生了tom销毁了ketty出生了berry销毁了ketty销毁了*/

十一、继承

1、继承介绍

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

语法

class 子类 extends 父类{   }

例题

'; }}//子类继承父类class Student extends Person { }//测试$stu=new Student;$stu->show(); //这是人类

执行过程:

第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找

第二步:在Person类中查询show()

2 子类中调用父类成员

'; }}//子类class Student extends Person { public function test() { //方法一; /* $person=new Person(); $person->show(); //这是人类 */ //方法二 $this->show(); //这是人类 }}//测试$stu=new Student;$stu->test();

小结:

1、方法一:通过实例化父类调用父类的成员

2、方法二:通过$this关键字调用父类的成员

2、子类中调用父类成员

'; }}//子类class Student extends Person { public function test() { //方法一; /* $person=new Person(); $person->show(); //这是人类 */ //方法二 $this->show(); //这是人类 }}//测试$stu=new Student;$stu->test();

小结:

1、方法一:通过实例化父类调用父类的成员

2、方法二:通过$this关键字调用父类的成员

3、protected

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

例题:

//例题一:
num; }}//测试$obj=new B(); //整个继承链上有A和B$obj->getNum(); //10//例题二:
num; }}class B extends A { protected $num=10; }//测试$obj=new B(); //整个继承链上有A和B$obj->getNum(); //10//例题三:
num; }}class B extends A { protected $num=10; }//测试$obj=new A(); //整个继承链上只有A$obj->getNum(); //Notice: Undefined property: A::$num

4、继承中的构造函数

规则:

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

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

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

类名::__construct()

例题

'; }}class Student extends Person { //子类的构造函数 public function __construct() { Person::__construct(); //通过父类的名字调用父类的构造函数 parent::__construct(); //parent表示父类的名字 echo '这是子类
'; }}//测试new Student();

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

例题:给父类传递参数

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}
"; echo "性别:{ $this->sex}
"; echo "成绩:{ $this->score}"; }}//测试$stu=new Student('tom','男',88);$stu->getInfo();/*姓名:tom性别:男成绩:88*/

5、$this详解

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

';new B(); //object(B)#1 (0) { }

6、多重继承

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

c++和go允许继承

在这里插入图片描述

在这里插入图片描述

转载地址:http://miiv.baihongyu.com/

你可能感兴趣的文章
mysqlbinlog报错unknown variable ‘default-character-set=utf8mb4‘
查看>>
mysqldump 参数--lock-tables浅析
查看>>
mysqldump 导出中文乱码
查看>>
mysqldump 导出数据库中每张表的前n条
查看>>
mysqldump: Got error: 1044: Access denied for user ‘xx’@’xx’ to database ‘xx’ when using LOCK TABLES
查看>>
Mysqldump参数大全(参数来源于mysql5.5.19源码)
查看>>
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>