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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,108评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,699评论 1 296
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,812评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,236评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,583评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,739评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,957评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,704评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,447评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,643评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,133评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,486评论 3 256
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,151评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,889评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,782评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,681评论 2 272

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,103评论 18 139
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,517评论 6 13
  • 重绘-下载进度条(setNeedsDisplay)的步骤 布局控件:UISliderView,自定义view用来画...
    翻这个墙阅读 458评论 0 0
  • 1. 可以先创建好用来登录ftp服务器的用户 2. 启动ftp和iis服务功能控制面板->程序和功能->打开或关闭...
    小小机器人阅读 4,353评论 0 7
  • 人总是被zuo死的…… 没有人一味地包容你[伤心] 总是那么自私的你,没本事把自己真实的嘴脸展现...
    无惘阅读 221评论 0 0