面向对象(OOP)

要点:

  1. 面向对象的介绍
  1. 如何声明一个类
  2. 通过类实例化对象
  3. 封装性
  4. 继承性
  5. 多态性
  6. 常见的关键字和魔术方法
  7. 单例模式的实现
  8. 抽象类与接口
  9. 命名空间

讲师:杨应勇

对象是客观存在的一个实体。
类是对对象抽象的一个描述。
    
概念:对象(实体)、类、 类与对象的关系。
oop面向对象编程的特点:封装、继承、多态
    
类和对象的关系:
    类的实例化结果就是一个对象(使用new关键字)
    对对象的抽象描述就是一个类

一、如何定义一个类,和使用

1.1 语法格式:
    [修饰符] class 类名
    {
       【成员属性】定义变量   

       【成员方法】定义函数
    }

    [修饰符] class 类名 [extends 父类] [implements 接口1[,接口2...]]{
       【成员属性】定义变量   

       【成员方法】定义函数
    }

1.2 其中成员属性格式:
        修饰符 $变量名[=默认值];  如:public $name="zhangsan";
        注意:成员属性不可以是带运算符的表达式、变量、方法或函数的调用。 如:
                public $var3 = 1+2; 
                public $var4 = self::myStaticMethod();
                public $var5 = $myVar;
        正确定义方式:
                public $var6 = 100; //普通数值(4个标量:整数、浮点数、布尔、字串)
                public $var6 = myConstant; //常量
                public $var7 = self::classConstant; //静态属性
                public $var8 = array(true, false);  //数组
                
        常用属性的修饰符:public、protected、private、static、
        
1.3 其中成员方法格式:
        [修饰符] function 方法名(参数..){
            [方法体]
            [return 返回值]
        }
        
        常用的修饰符:public、protected、private、static、abstract、final
        
1.4 对象: 他是通过new 类()来产生的对象。其中new称为实例化
    也就是:类的实例化就会产生一个对象。
    如: $p = new Person();

1.5 $this 关键字: 表示自己,表示当前使用对象。
  我们在类中调用自己的成员属性或函数都是使用 $this->调用。
  注意:非静态方法中可以使用this关键字  

二、构造函数和析构函数

2.1. 构造方法(构造函数):
    当我们通过new关键字来创建一个对象时,第一个自动执行的方法称为构造方法。
    方法名__construct();  主要用于初始化对象。
    (在php4.0时可使用与类名重名的方法作为构造方法)
    
2.2. 析构方法:当这个对象被销毁时最后自动调用的方法,称为析构方法。
     __destruct(); 目的是释放资源(如关闭连接、文件,释放资源)

三、封装(访问控制)

3.1 封装:就是将属性私有,并提供公有的setter放置与getter取值方法

         public(公有)    protected(受保护)    private(私有)
  ===========================================================
   在本类中      Y               Y                   Y
   在子类中      Y               Y                   N 
   在类外边      Y               N                   N

四、 重载

4.1 属性重载中的四个魔术方法:__set() __get() __isset() __unset() 

  * __get():当我们直接输出一个对象中的非公有属性时会自动调用的方法,
            并将属性名以第一个参数传进去。
            __get($name){...}
            
  * __set(); 当我们直接设置一个对象中的非公有属性时会自动调用的方法,
            并将属性名以第一个参数,值作为第二参数传进去。
            __set($name,$value){...}

   __isset()当对未定义的变量调用isset() 或 empty()时,__isset() 会被调用。
       //当isset判断一个对象的非公有属性是否存在时,自动调用此方法。
       public function __isset($param){
          return isset($this->$param);
       }
       
   __unset()当对未定义的变量调用unset()时,__unset() 会被调用。
       //当unset销毁一个对象的非公有属性时,自动调用此方法。
       public function __unset($param){
          unset($this->$param);
       }
       
4.2 方法的重载:
    *  mixed __call ( string $name , array $arguments )
      mixed __callStatic ( string $name , array $arguments )  php5.3.0支持

    当调用一个不可访问方法(如未定义,或者不可见)时,__call() 会被调用。 
    其中第一个参数表示方法名,第二参数表示调用时的参数列表(数组类型)

    当在静态方法中调用一个不可访问方法(如未定义,或者不可见)时,__callStatic() 会被调用。 

五、 继承

5.1. 继承:extends
     假如B类继承A类,那么就继承了A中所有非私有属性和方法(函数)。
      其中A叫父类(基类)。 B叫子类(派生类)
     class B extends A{ 
        ....
     }

    在php中类只支持【单一继承】,就是一类只能继承一个父类。

    parent关键字:若子类出现覆盖父类的方法,那么有时还想调用被覆盖掉了的方法,
    我们就是用关键字【parent::父类方法】还有使用类名
    
    
    class A{
        public function __construct(){
            //....
        }
    }
    class B extends A{
        public function __construct(){
            parent::__construct();//注意要调用一下父类的构造方法
            //....
        }
    }

六、 final、static和const

6.1 final关键字:主要用于修饰类与成员方法(函数)
   
   使用final关键字修饰类,表示这个类不可以有子类。(一般是没有必要有子类的,防止有子类的覆盖)
   使用final关键字修饰的方法,不可以在子类中被覆盖(重写)。
    目的:一是为了安全,二是没有必要
*6.2 static关键字:表示静态的意思: 用于修饰类的属性和方法
   *static关键字修饰方法称为静态方法,可以不用new(实例化)就可以直接使用方法:如 类名::方法名
        注意:静态方法在实例化后的对象也可以访问  //$对象名->静态方法名
      
   static关键字修饰属性称为静态属性,可以不用new(实例化)就可以直接访问属性:如 类名::属性名
         注意:静态属性在实例化后的对象不可以访问; //$对象名->静态属性名
   
   注意:静态属性是共享的。也就是new很多对象也是共用一个属性
        *在静态方法中不可以使用非静态的内容。就是不让使用$this
         在类的方法中可以使用其他静态属性和静态方法,不过要使用self关键字:
             如 【self::静态属性名】或【self::静态方法名】
        
        (>PHP5.3)在一个类的方法中若没有出现$this的调用,默认此方法为静态方法。
             
*6.3. const关键字: 在类中修饰成员属性,将其定义成常量(不可修改的),
    一般要求常量名都是大写的,没有“$”符 没有其他修饰符(public)
    在其他方法中使用常量: 【self::常量名】
    定义格式:  const 成员常量名="值"; 
 使用:在类的方法中:   echo self::成员常量名;
         在类的外部:   echo 类名::成员常量名;

6.4. 检测当前对象是否是属性指定的类
    instanceof 用于确定一个 PHP 变量是否属于某一类 class 的实例:
         
    is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE

七、 类型约束

1. 类型约束可以使用的类型是:数组或对象。
    若指定的一个类名,那么可传入本类及子类的对象进去。
    可以使用的约束类型:(复合类型)数组array,类名、抽象类名、接口名
//如下面的类
class MyClass
{
    /**
     * 测试函数
     * 第一个参数必须为类OtherClass的一个对象
     */
    public function test(OtherClass $otherclass) {
        echo $otherclass->var;
    }



    /**
     * 另一个测试函数
     * 第一个参数必须为数组 
     */
    public function test_array(array $input_array) {
        print_r($input_array);
    }
}

八、其他魔术方法:

1. 对象复制clone 克隆一个对象,因为对象属于引用类型,普通的“=”号属于引用赋值,
    所有需要clone来复制一份。
    魔术方法:__clone() 当执行clone克隆时会自动调用的方法。

2. __toString()方法:魔术方法,当我们直接要输出一个对象时,如echo $a,print $a,
    那么会自动调用的方法。
    注意:__toString()方法必须返回一个字串类型的值。


3. *自动加载类函数__autoload(类名): 
    当new 实例化一个对象时,这个类若不存在,则自动调用此函数,并将类名存入参数
    我可以使用这个实现类的自动加载。

九、 对象序列化(串行化)(webservice XML)(在对象持久化存储、和传输中使用)

serialize() -- 串行化
unserialize() -- 反串行化

php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。
unserialize()函数能够重新把字符串变回php原来的值。 
序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

__sleep 和 __wakeup 

    __sleep(): 是执行串行化时自动调用的方法,目的是实现资源类型的属性实关闭操作。
        注意:sleep方法需要返回一个数组,其中数组中的值是串行化时要保留的属性名
        
    __wakeup():是在执行反串行化时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源)

public function __seep(){
    return array('server', 'username', 'password', 'db');
    //此串行化要保留四个属性
}

十、 抽象类:

  当类中有一个方法,他没有方法体,也就是没有花括号,直接分号结束。
如 public abstract function fun();
象这种方法我们叫抽象方法,必须使用关键字abstract定义,
包含这种方法的类必须是抽象类也要使用关键字abstract加以声明。

抽象类的特点:
不能实例化,也就new成对象
若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。

其实抽象类对于子类(实现类),有一个约束的作用,

含有抽象方法的类肯定是抽象类,但是不是所有的抽象类都必须包含抽象方法。

十一、 接口:

假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口
接口使用关键字interface来定义,接口中只能有常量与抽象方法。
格式:
interface 接口名{
[常量定义]
[抽象方法定义] //注意不要有abstract关键字
}

实现方式:class 类名 implements 接口名,接口名2{
实现体。。
}

十二、多态

*多态(使用方式):对于同一个方法,传入不同对象,实现了不同的效果,这个就是多态的意思,
  需要使用的技术:继承或实现,方法的覆盖(重写)。

实例:
主板:mainboard   PCI插槽(规范接口)  

第三方生产
声卡: soundCard
网卡: networkCard 

设计模式:单例、单态设计模式

十三、异常处理:

在php5中有一种新的错误处理机制--异常处理:(采用面向对象方式的)
涉及的类:Exception异常类
结构:
    <?php
        class Exception
        {
            protected $message = 'Unknown exception';   // 异常信息
            protected $code = 0;                        // 用户自定义异常代码
            protected $file;                            // 发生异常的文件名
            protected $line;                            // 发生异常的代码行号

            function __construct($message = null, $code = 0);

            final function getMessage();                // 返回异常信息
            final function getCode();                   // 返回异常代码
            final function getFile();                   // 返回发生异常的文件名
            final function getLine();                   // 返回发生异常的代码行号
            final function getTrace();                  // backtrace() 数组
            final function getTraceAsString();          // 已格成化成字符串的 getTrace() 信息

            /* 可重载的方法 */
            function __toString();                       // 可输出的字符串
        }
    ?> 


使用:
    1. throw new Exception("年龄不可以为负数"); //异常抛出
    2. try{
            //捕获异常
            $s->age=30;
            $s->age=-40;
    3.  }catch(Exception $e){
            //异常处理
            echo $e->getmessage();
        }

php面向对象中的实用类:

  1. Model.php 表数据信息操作类

  2. Page.php 分页类
    方法:属性:URL地址、条件、总页数、总条数、页大小、当前 页
    构造方法(参数:总条数、页大小、条件)
    私有方法:计算最大页数、判断当前页数是否越界
    输出分页信息方法:(输出给Model类中limit方法使用)
    私有属性的getter方法(__GET());
    输出分页信息方法(输出HTML代码)(就是:【上一页】【下一页】。。。。)

  3. images.class.php 图片处理类(等比缩放、图片水印、裁剪);

  4. fileupload.class.php 文件上传类

  5. 验证码输出

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

推荐阅读更多精彩内容