17.PHP面向对象-基础

把大象装进冰箱里,一共分几步?

举个例子
场景:
         学生,做,报告。
学生:
         姓名,技能
         萧峰,降龙十八掌
         令狐冲,独孤九剑
报告:
        某个学生喊出:谁,到!
技能:
        某个学生完成某项技能: 谁,技能!

为什么要面向对象

  • 将一系列相关的操作和数据封装(整理)到一起。因为有些数据和操作要一起出现。

  • 现实中,业务逻辑都是由某个主体发出的。主体可以是人、物、事。编写程序为的就是解决现实的业务逻辑,因此,采用与现实一致的实现思路,就是主体发出某个操作编程思想,才能更好的描述和解决现实的问题。

基础概念

 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|郑智、郜林、高拉特...

你可能感兴趣的:(17.PHP面向对象-基础)