把大象装进冰箱里,一共分几步?
举个例子
场景:
学生,做,报告。
学生:
姓名,技能
萧峰,降龙十八掌
令狐冲,独孤九剑
报告:
某个学生喊出:谁,到!
技能:
某个学生完成某项技能: 谁,技能!
为什么要面向对象
-
将一系列相关的操作和数据封装(整理)到一起。因为有些数据和操作要一起出现。
-
现实中,业务逻辑都是由某个主体发出的。主体可以是人、物、事。编写程序为的就是解决现实的业务逻辑,因此,采用与现实一致的实现思路,就是主体发出某个操作编程思想,才能更好的描述和解决现实的问题。
基础概念
class hero{
public $name;
public $jineng;
public function baogao(){
echo $this->name.'喊出了:到!';
}
public function jineng(){
echo $this->name.'释放了'.$this->jineng.'技能';
}
}
类:
将某种对象的特点,提取出来,形成该种对象的类。依据某个类,将对象创建出来。
对象:
object,现实业务逻辑中的实体,在程序中的映射。主体在现实中叫实体,在程序中叫做对象。
属性:
property,实体对应的属性,在程序中,就是对象拥有的属性,也叫成员属性。
方法:
method,实体对应的操作,在程序中,称之为对象的方法,也叫成员方法。
基础语法
类的创建
通过class声明,接{}
,在{}
中添加类的属性和方法。
类的实例化
通过将 类 (class) 实例化 (new) 而产生的叫做对象,类相当于图纸;实例化相当于施工;对象相当于楼。
使用对象
使用对象的属性和方法。用运算符->
。对象->方法() 或 对象->属性
-
属性的操作
属性是数据。针对数据的操作类似对变量的操作。
赋值:取值运算
判断是否为空:isset(),property_exists()
删除:unset()
可变属性:属性也支持可变标示符语法 -
方法的使用
-
$this
局部变量
$this就是这个对象的意思
对象间的赋值
使用者的角度:对象之间没有值传递,只有引用传递。
如何通过已有的对象,得到一个拷贝(复制)。得到一个一模一样的新对象
对象的克隆
通过已有的对象,获取新的对象。与已有对象属性完全一样的新对象
语法
新对象 = clone 新对象
内存中会出现一个新的对象空间,克隆时,会将原有对象的所有属性,一模一样的复制一份,带来的问题是,不能通过属性来区分哪个是已有对象,哪个是克隆对象。
解决办法
老办法:在克隆完成时,手动将特定的属性进行设置。
新办法(推荐):使用一个特殊的方法来完成。__clone
,其特点是,当进行克隆操作时,会自动使用克隆的新对象来调用该方法。
深克隆
如果某个对象的属性值为另一个对象,那么克隆该对象时,php是浅克隆,指的是仅仅克隆当前对象,如果属性还是对象,不完成克隆操作。如果需要深度克隆,需要自己编写程序。
构造方法
__construct()
在对象实例化的过程中,自动调用。
其作用
-
实例化对象时,完成对对象的初始化工作,通常设置属性的初始值,初始方法的调用。该方法可以不存在,但一旦定义,php就会在实例化时调用。
-
可以用来接收参数。当实例化时,可以在类后使用括号,传递实参列表的表达式。可以利用该形参(会被实参赋值),对对象进行初始化工作。
语法上,php支持类名同名的方法为构造方法
析构方法
__destruct()
在对象被销毁时,自动调用。
什么情况下会导致对象销毁?
一、脚本周期结束,php会释放(销毁)所有的资源,此时会销毁对象。
二、unset存储的对象变量。
三、对象变量存储了其他的值。
其作用
-
完成收尾的工作
为了保证任何对象的修改,都会存储到数据库中,而不会因为对象被销毁前忘记了调用保存方法,而丢失掉修改的数据,利用析构方法完成任务。 -
释放额外的资源
关闭数据库等。
类文件
实际开发过程中,将类的文件独立出来。程序中如果需要使用到该类,加载即可。require xxx.class.php
,可以更好的重用类,建议的命名方法 类名.class.php
,额外的,类名通常采用首字母大写的驼峰命名法。
类文件载入
如果项目中类文件很多,怎么办?
如果项目中类文件很多,就会出现类文件加载吃力,原因有二:
- 重复加载
类只需要加载一次 - 加载多余
加载了不需要的类
可见一种按需加载的机制。需要时,再加载,如果不需要就不加载。这种加载机制称之为自动加载。
类文件自动加载
需要判断是否需要类的时机。也即是当程序执行到需要类时(需要&&未定义),同时该类没有被定义。
$obj = new Obj($params);//php核心程序调用__autoload($params);
function __auto($params){
require './'.$params.'.class.php';
}
此时,php核心会自动调用一个默认为__autoload()
的函数,并将当前需要的类名作为参数传递到函数中,我们便可以在方法中根据参数完成相应类的加载即可。
带来的好处是:如果需要载入多个类,则该方法会被调用多次(只要类没有定义)。
自动加载业务 逻辑核心
- 类名与类文件地址存在对应关系(自动但是需要按照规律来)
能够通过 类名 找到类文件的位置才可以!对应关系,php核心是处理不了的,需要人为定义,在定义类名和存储类文件时,要按照一定的规律(规则)去做。
例如:
核心类 core/ :DbCore.class.php、libCore.class.php
工具类 tool/: iamgeTool.class.php、uploadTool.class.php
//根据类名加载
function __autoload($classname){
if('Core'==substr($classname,-4)){
require './core/'.$classname.'class.php';
}
if('Tool'==substr($classname,-4)){
require './tool/'.$classname.'class.php';
}
//如果存在其他的规则,再加载即可
}
- 实际开发中,常见规律:(效率高,类名随意但是没预见性的要提前加映射)
制作类名与类文件的映射列表:
$class_list = array(
'libCore' => './core/libCore.class.php',
'DbCore' => './core/ibCore.class.php',
);
先判断类是否存在于映射列表中
function __autoload($classname){
if(isset($class_list[$classname]){
require $class_list[$classname];
}
}
综合起来如下:
function __autoload($classname){
if(isset($class_list[$classname]){
require $class_list[$classname];
}
elseif('Core'==substr($classname,-4)){
require './core/'.$classname.'class.php';
}
elseif('Tool'==substr($classname,-4)){
require './tool/'.$classname.'class.php';
}
//如果存在其他的规则,再加载即可
}
- 但是默认__autoload()为自动加载,有局限:
其一:不能存在多个,项目多个模块开发,存在不同模块的自动加载,项目如果使用第三方模块,也会由第三方定义自动加载(Smarty)。
其二:如果注册了新的自动加载则默认的自动加载失效。
可见,需要特殊的名字,作为自动加载函数名,告知php核心,自动加载函数名
spl_autoload_register('自定义自动加载函数名');
在使用类之前:注册一个自动加载函数,通常会在定义函数前就注册好, 一旦注册了额外的自动加载函数,则默认的__autoload()就不起作用了,php允许注册多个额外的自动加载。并且在需要类时,会依据注册的顺序,逐一调用自动加载类。
Have a tyr
一、定义一个类,存在多个属性,为属性复制。要求属性为不同的数据类型(php八种类型),分别尝试赋值操作。
二、设计一个学生类。要求:
1.存储学生的姓名,年龄,爱好等属性。
2.在实例化时完成姓名、性别、的初始化工作,并提示:你好,我是XXX,我来了。
3.提供四个方法,可以设置学生的姓名,性别,年龄,爱好。
4.增加析构方法,要求学生对象被销毁时,提示再见。
三、定义数据库操作类,MySqlDB,用于替换之前的mysql函数的基本操作,要求:
1.设计必要的属性。
2.实例化时对属性记性初始化。
3.实例化时完成数据库连接。
4.实例化时设置字符集编码。
5.实例化时选择默认的数据库。
6.增加一个执行sql的方法,可以执行SQL,并返回相应结果。
四、设计足球比赛的管理系统,功能如下,
1.展示信息如下表1
2.点击球队实现球队信息如表2
球队1 | 比分 | 球队2 | 比赛时间 |
---|---|---|---|
北京国安 | 2:3 | 广州恒大 | 2017-10-01 20:30:00 |
球队|人数| 球员
-|-|-|-
广州恒大|11|郑智、郜林、高拉特...
网友评论