1.面向过程与面向对象理解
1.1.面向过程的编程思想
- 面向过程是以过程(步骤)为中心的编程思想
- 例如:递归思想、冒泡思想、二分法查找
- 解决一个大问题,先把大问题分解成一个个小问题,再把小问题一个个解决,最终大问题解决了
1.2.面向对象的编程思想
- 面向过程是以事物(对象)为中心的编程思想
- 面向过程着重与做什么,面向对象着重于谁来做
总结:面向对象适合大项目(人多),面向过程适合小项目(人少)。
2.类和对象的关系
- 现实中,先有对象,后有类
- 在计算机中,先有类,后有对象
2.1类的概念
- 类就是分类、类别、概念、理论,无形的、看不见、摸不着、不存在。
- 类由相同属性和方法构成
- 一个类可以产生千千万万个对象
2.2对象的概念
- 对象就是一个个的实体。有形的、存在的
- 对象也是由属性(特征)和方法(行为)构成
3.类的定义
语法格式说明:
- class是声明类的关键字,不区分大小写;
- 类名、函数名、关键字、都不区分大小写;
- ClassName是类的名称,类名的命名规则与变量已有,但不带$符号;
- 类名可以由字母、数字、下划线构成;
- 类名不能以数字开头,但可以以字母、下划线开头
- 类名一般用“驼峰式”命名;
- 类名后部分小括号();
- 大括号{}定义的是类的成员属性和成员方法。
//例:定义一个学生类
class Student{
//成员属性
public $name="神乐";
public $sex="70";
//成员方法
public function showInfo(){
echo "{$this->name}的年龄是{$this->sex}岁!";
}
}
4.定义类的成员属性
- 类中只有两个内容,分别为:成员属性和成员方法。类的成员就是对象,又称“对象属性”和“对象方法”
4.1成员属性介绍
- 成员属性:就是普通变量
- 成员属性和普通变量的区别:
- (1)成员属性一定要有前提,就是“谁的属性”,普通变量一般都是全局变量;
- (2)成员属性一定要加权限控制符,而普通变量不需要
4.2定义格式
- 权限控制符 变量名 = 变量值;
- 可以给变量制定默认值,也可以没有
4.3访问修饰符
主要用来保护数据的安全
修饰符 | 说明 |
---|---|
public(公共权限) | 在任何地方可以访问,主要指类内部、类外部,子类中都可以访问 |
protected(受保护的权限) | 只能在本类中、子类中访问,在类外不能访问 |
private(私有的权限) | 只能在本类中访问,在类外、子类中都无权访问 |
5.定义类的成员方法
5.1成员方法介绍
- 成员方法:就是普通函数
- 成员方法与普通函数的区别:
- (1)成员方法,一定是某个对象的方法,不能单独存在
- (2)成员方法要加权限控制符,普通函数不需要加
- (3)成员方法可以省略权限控制符,默认为public,建议不要省略
- 成员方法和普通函数一样,都有返回值和参数
5.2定义格式
权限控制符 function funName(形参1,形参2,…){
//该方法的功能代码;
[return 参数]
}
6.创建类的实例对象
6.1实例对象含义
- 类可以产生N多个对象
- 类几乎不占用内存,但每个对象都要占内存
- 平常只有对象才可以帮我们做工作,而不是类
- 在js中,创建类的对象的方法:var obj=new Student();
- 在PHP中,创建类的对象的方法:$obj = new Student();
- 使用new关键字来创建类的对象
- 对象不能单独存在,对象必须属于某个类。没有类,一定没有对象
6.2定义格式
//创建类的对象的语法(类的实例化)
$obj=new ClassName;//无参数 无括号
$obj=new ClassName();//无参数 有括号
$obj=new ClassName(实参1,实参2,...);//有参数 有括号
7.对象属性的操作
7.1访问对象的属性和方法
- 在js中、访问对象的属性和方法,使用小数点来访问:document.write()
- 在PHP中,访问对象的属性和方法,使用箭头->来访问:obj->showInfo()
- name表示访问$name变量值的属性
- 符号
7.2对象属性的操作:增加、删除、修改、读取
//类的实例化
$obj=new Student();
//1.修改对象属性:对已存在的属性重新复制
//$obj->$name表示访问$name变量值的属性
//$obj访问属性,属性不加$符号
$obj->name="kakura";
//2.添加新属性:给不存在的属性赋值
$obj->cartoon="银魂";
//3.删除属性
unset($obj->name,$obj->sex);
//4.读取对象属性的值
echo "{$obj->name}的年龄是{$obj->sex}岁!";
8.伪变量$this
- PHP中$this代表当前对象,用来调用对象的属性和方法
- $this只能在成员方法中存在,其他地方都不能使用
- $this对象是怎么来的?当使用$obj对象调用成员方法时,自动将当前对象$obj传递到成员方法中,在成员方法中,使用$this变量来代替传递过来的$obj变量
//例:定义一个学生类
class Student{
//成员属性
private $name="神乐";
private $sex="70";
//私有的成员方法:返回一条水平线
private function showLine(){
return '<hr/>';
}
//成员方法
public function showInfo(){
$str="<h2>{$this->name}的基本信息如下:</h2>";
$str.=$this->showLine();
$str.= "{$this->name}的年龄是{$this->sex}岁!";
echo $str;
}
}
$obj=new Student();
$obj->showInfo();
9.self关键字
- | $this | slef |
---|---|---|
代表 | 代表当前对象 | 代表当前类 |
调用 | 调用对象的 成员属性、成员方法 | 调用类的 类常量、静态属性、静态方法 |
符号 | 使用箭头->调用 | 使用双冒号::调用 |
位置 | 只能在成员方法中使用 | 可用在成员方法,静态方法中 |
以下代码可对比上一个代码:
class Student{
//公共的静态方法
public static $title="<h2>club</h2>";
//私有的静态方法
private static function showLine(){
return "<hr/>";
}
//公共的成员方法
public function showInfo($name,$age){
$str=self::$title;
$str.=self::showLine();
$str.="{$name}的年龄是{$age}岁";
echo $str;
}
}
//创建学生类的对象
$obj=new Student();
$obj->showInfo("kakura",70);
//创建第2个对象
$obj2=new Student();
$obj2->showInfo("gangna",20);
10.parent关键字
- self代表当前类,parent代表父类
- self可以调用本类的内容:类常量、静态属性、静态方法、成员方法
- parent可以调用父类的内容:类常量、静态属性、静态方法、成员方法
11.定义类的常量
- 常量:不能修改,不能删除
- 提示:在一次HTTP请求过程中,常量不能修改
- 类常量定义使用const关键字,Define()定义的常量为全局常量
- 类常量,就是类的常量,与对象无关
- 类常量只能通过类名(类名::常量)来调用,成员的东西,只能通过对象来调用
- 访问类常量,是通过范围解析符(::)来访问类的常量:Student::TITLE
- 访问对象的内容,是通过箭头->来访问:$obj->name
- 类常量在内存中只有一份,不会随着对象增加而增加。
- 类常量可以被所有对象共享
- 好处:节省内存
//例:定义一个学生类
class Student{
//类常量
const DB_HOST="localhost";
const DB_USER="root";
const DB_PWD="";
//公共的成员方法
public function showInfo(){
$str="主机名:".Student::DB_HOST;
$str.="<br>用户名:".Student::DB_USER;
$str.="<br>密码:".Student::DB_PWD;
return $str;
}
}
//1.直接访问类的常量,静态化调用方式
$str="主机名:".Student::DB_HOST;
$str.="<br>用户名:".Student::DB_USER;
$str.="<br>密码:".Student::DB_PWD;
echo $str."<hr/>";
//2.对象实例化
$obj=new Student();
echo $obj->showInfo();
12 静态属性和静态方法
- static关键字修饰
- 静态属性和方法,与类相关,与对象无关
- 静态属性和方法在内存中只有一份,不会随着对象增加而增加。
- 可以被所有对象共享
- 静态属性的值是可以改变的
- 静态属性和方法,是有权限控制符的
//例:定义一个学生类
class Student{
//公共的静态方法
static public $title="<h2>club</h2>";//多个修饰符关键字,顺序可以不一致
//私有的静态方法
private static function showLine(){
return "<hr/>";
}
//公共的成员方法
public function showInfo($name,$age){
$str=Student::$title;
$str.=Student::showLine();
$str.="{$name}的年龄是{$age}岁";
echo $str;
}
}
//创建学生类的对象
$obj=new Student();
$obj->showInfo("kakura",70);
//创建第2个对象
$obj2=new Student();
$obj2->showInfo("gangna",20);
13 最终类和最终方法
- Final最终类,不能被继承,直接实例化。该类已经完善,不需升级扩展
- 最终方法,不能被重写,直接调用
- 一般,数据库操作类,也可定义为最终类
14 抽象类和抽象方法
- Abstract抽象类:该类只能被继承,不能直接实例化。常用于基础类
- 抽象方法:该方法没有方法体,抽象方法必须先继承,后重写
- 如果一个类中有一个抽象方法,该类必须声明为抽象类
- 抽象方法作用:方法的命名规范,是一种监督的机制
- 抽象类中,也可能有其他元素:成员属性、成员方法、静态属性、具体方法、常量
- 抽象方法不能是静态方法,只能是成员方法
//定义抽象的商品基础类
abstract class Shop{
//抽象方法
abstract protected function showInfo($a,$b);
abstract protected function readMe();
}
//定义手机类,并继承商品类
final class Mobile extends Shop{
//重写showInfo()抽象方法
public function showInfo($a2,$b2){
echo "{$a2}的年龄是{$b2}岁";
}
//重写readMe()抽象方法
public function readMe(){
echo "<hr>这是成员方法:".__METHOD__;
}
}
//创建手机类对象
$obj=new Mobile();
$obj->showInfo("kakura",70);
$obj->readMe();