一、面向对象介绍
1.1 介绍
面向对象是一个编程思想,编程思想有面向过程和面向对象。 面向过程:编程思路集中的是过程上。 面向对象:编程的思路集中在参与的对象。
1.2 面向对象的好处
- 多人合作方便
- 减少代码冗余,灵活性高
- 代码的可重用性发挥到极致
- 可扩展性强
1.3 类和对象
-
对象是具体存在的事务,对象是由属性(变量)和方法(函数)组成的
-
类是具有相同属性和行为的一组对象的集合
二、 在php中实现类和对象
2.1 创建类
语法:
class 类名 {
// 属性
// 方法
// 常量
}
类是由属性、方法、常量组成的,也可以说类成员有:属性、方法、常量。
类名的命名规则:
- 以字母、下划线开头,后面跟的是字母、数字、下划线。
- 不能用PHP关键字做类名
- 类名不区分大小写(变量名区分,关键字、类名不区分大小写)
- 类名用帕斯卡命名法(大驼峰 单词的首字母大写)
2.2 实例化对象
创建完类后,通过new 类名()进行实例化
例:
<?php
// 定义类
class Student {
}
// 实例化对象
$stu1=new Student();
$stu2=new Student();
$stu3=$stu2; // 对象传递默认是传递地址
// 对象比较
var_dump($stu1,$stu2,$stu3);
var_dump($stu1==$stu2); // bool(true) 比较对象结构
var_dump($stu1===$stu2); // bool(false) 是否为同个对象
var_dump($stu2===$stu3); // bool(true) 为同个对象
?>
效果:
对象的比较:
相等:结构和保存的值一样就相等
全等:指向同一个对象才是全等
2.3 类添加属性和方法
属性本质就是变量
通过 ->调用对象的成员
对象名->属性名 对象名 -> 方法名()
-
属性
代码:
<?php
// 定义类
class Student {
public $name; // 姓名属性
public $add='地址不详'; // 地址属性,默认值为地址不详
}
// 实例化对象
$stu=new Student();
// 给属性赋值
$stu->name='Jack';
$stu->add='厦门';
// 获取属性的值
echo '姓名:'.$stu->name,'<br/>';
echo '地址:'.$stu->add,'<br/>';
// 添加属性
$stu->age=20; // 只给对象加了这个属性,而不是类。
print_r($stu);
echo '<br/>';
// 删除属性
unset($stu->add);
print_r($stu);
?>
效果:
2. 方法
代码:
<?php
// 定义类
class Student {
// 定义方法
public function show() {
echo '这是show方法<br/>';
}
// public可以省略,如果省略,默认就是public
function test() {
echo '这是test方法';
}
}
$stu=new Student();
$stu->show();
$stu->test();
?>
效果:
小结:
1、方法前面public是可以省略,如果省略,默认就是public的。
2、属性前面的public不能省略。
三、访问修饰符
访问修饰符用来控制成员的访问权限
| 修饰符 | 描述 |
|---|---|
| public (公有的) | 在类的内部和外部都能访问 |
| private(私有的) | 只能在类的内部访问 |
| protected(受保护的) |
测试:
<?php
class Student {
public $name='tom';
private $add='Amoy';
}
$stu=new Student();
echo $stu->name;
echo $stu->add;
?>
效果:
属性一般都是私有的,但是可以通过公有的方法对私有的属性进行复制和取值。
作用:保证数据的合法性。
代码:
<?php
// 访问修饰符
class Student {
private $name; // 属性一般是私有的
private $add;
// 通过公有的方法对私有的属性进行赋值
public function setIn($name, $add) {
$this->name=$name; // $this表示当前对象
$this->add=$add;
}
// 取值
public function getIn() {
echo '姓名:'.$this->name,'<br/>';
echo '地址:'.$this->add,'<br/>';
}
}
$stu=new Student();
$stu->setIn('Jack', 'Amoy');
$stu->getIn()
?>
效果:
这样一来不是变的很繁琐,直接将属性设置为公有多省事,其实不然,设为私有的可以进行相对应的拦截,例如:
地址不是Amoy,就显示地址必须要是Amoy:
<?php
// 访问修饰符
class Student {
private $name; // 属性一般是私有的
private $add;
// 通过公有的方法对私有的属性进行赋值
public function setIn($name, $add) {
if ($add!='Amoy') {
echo '地址必须是Amoy!';
exit;
}
$this->name=$name; // $this表示当前对象
$this->add=$add;
}
// 取值
public function getIn() {
echo '姓名:'.$this->name,'<br/>';
echo '地址:'.$this->add,'<br/>';
}
}
$stu=new Student();
$stu->setIn('Jack', 'Amoy1');
$stu->getIn()
?>
效果:
那么就可以用来做过滤数据用。
四、类和对象在内存中的分布
- 对象的本质是一个复杂的变量
- 类的本质是一个自定义的复杂数据类型
- 栈区:运行速度快,体积小,保存基本类型
- 堆区:运行速度稍慢,体积大。保存复杂类型
- 实例化的过程就是分配内存空间的过程
- 对象保存在堆区,将堆区的地址保存到栈区。
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。