美文网首页
17.PHP面向对象-基础

17.PHP面向对象-基础

作者: dptms | 来源:发表于2017-04-14 09:09 被阅读318次

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

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

    为什么要面向对象

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

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

    基础概念

     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面向对象-基础

          本文链接:https://www.haomeiwen.com/subject/lvrmattx.html