PHP的面向对象

   PHP的面向对象:

===================================================

       对象是客观存在的一个实体。

       类是对对象抽象的一个描述。

      

       概念:对象(实体)、类、 类与对象的关系。

      

       oop面向对象编程的特征:封装、继承、多态

      

       类和对象的关系:

              类的实例化结果就是一个对象(使用new关键字)

              对对象的抽象描述就是一个类

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

-------------------------------------

       1.1 语法格式:

              [修饰符] class 类名{                   //abstract、final

                 【成员属性】定义变量  

                 【成员方法】定义函数

               【常量】定义常量

           【静态变量】定义常量  

              }

      

      

      

              [修饰符] 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();  主要用于初始化对象属性。

             

       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){...}

              什么是不可见:在类外面访问private或不是在继承关系时访问protected

         * __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::静态方法名】

                    

                     在一个类的方法中若没有出现$this的调用,默认此方法为静态方法,可以通过类名::方法名()访问。

                             

       *6.3. const关键字: 在类中修饰成员属性,将其定义成常量(不可修改的),

              一般要求常量名都是大写的,没有“$”符 没有其他修饰符(public)

              在其他方法中使用常量: 【self::常量名】

              定义格式:  const 成员常量名="值";

     使用:在类的方法中:   echo self::成员常量名;

                在类的外部:   echo 类名::成员常量名;

      

=========================================================           

=========================================================

                      

七、 类型约束

----------------------------------------------------

       1. 类型约束可以使用的类型是:数组或对象。

              若指定的一个类名,那么可传入本类及子类的对象进去。

              可以使用的约束类型:(复合类型)数组array,类名、抽象类名、接口名

       //如下面的类

       class MyClass

       {

              /**

               * 测试函数

               * 第一个参数必须为类OtherClass的一个对象

               */

              public function test(OtherClass $otherclass) {

                     echo $otherclass->var;

              }

      

              /**

               * 另一个测试函数

               * 第一个参数必须为数组

               */

              public function test_array(array $input_array) {

                     print_r($input_array);

              }

       }

12. 对象复制clone 克隆一个对象,因为对象属于引用类型,普通的“=”号属于引用赋值,所有需要clone来复制一份。

       魔术方法:__clone() 当执行clone克隆时会自动调用的方法。

      

13. __toString()方法:魔术方法,当我们直接要输出一个对象时,如echo $a,print $a,

       那么会自动调用的方法。

    注意:__toString()方法必须返回一个字串类型的值。

15. *自动加载类函数__autoload(类名):

              当new 实例化一个对象时,这个类若不存在,则自动调用此函数,并将类名存入参数

              我可以使用这个实现类的自动加载。      

             

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

-------------------------------------

       serialize() -- 串行化

       unserialize() -- 反串行化

       php里面的值都可以使用函数serialize()来返回一个包含字节流的字符串来表示。

       unserialize()函数能够重新把字符串变回php原来的值。

       序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。

       __sleep 和 __wakeup

      

              __sleep(): 是执行串行化时自动调用的方法,目的是实现资源类型的属性实关闭操作。

                     注意:sleep方法需要返回一个数组,其中数组中的值是串行化时要保留的属性名

                     public function __sleep(){

                            return array('server', 'username', 'password', 'db');

                            //此串行化要保留四个属性

                     }

                    

              __wakeup():是在执行反串行化时自动调用的方法,目的是实现资源属性的打开(sleep方法关闭的资源)

      

      

      

==========================================================

==========================================================

17. 抽象类: 

      当类中有一个方法,他没有方法体,也就是没有花括号,直接分号结束。

       如 public abstract function fun();

       象这种方法我们叫抽象方法,必须使用关键字abstract定义,

       包含这种方法的类必须是抽象类也要使用关键字abstract加以声明。

  

    抽象类的特点:

       不能实例化,也就new成对象

       若想使用抽象类,就必须定义一个类去继承这个抽象类,并定义覆盖父类的抽象方法(实现抽象方法)。

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

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

18. 接口:

   假如一个抽象类中所有的方法都是抽象的,那么我们可以使用另外一种方式定义:接口

   接口使用关键字interface来定义,接口中只能有常量与抽象方法。

   格式:

        interface 接口名  [extends 接口1 [,接口2] ]{

              [常量定义]

              [抽象方法定义] //注意不要有abstract关键字

        }

   实现方式:class 类名 [extends 父类 ]  implements 接口名,接口名2{

              实现体。。

   }

19. *多态(使用方式):对于同一个方法,传入不同对象,实现了不同的效果,这个就是多态的意思,

      需要使用的技术:继承或实现,方法的覆盖(重写)。

      

设计模式:单例(单态)设计模式

http://localhost/.../index.php?m=类名&a=方法名&其他参数

http://localhost/.../user/add.html

http://news.sohu.com/web/123456.html

http://news.sohu.com//find?id=123456

      

        

20。 异常处理:

       在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();

                     }catch(Exception $e){

                            //异常处理

                            echo $e->getmessage();

                     }

                    

                    

在类和对象中常用的函数

=============================================

       class_alias — 为类起个别名(>=5.3.0)

       *class_exists — 检查类是否已定义

       get_called_class — the "Late Static Binding" class name(>=5.3.0)

       *get_class_methods — 返回由类的方法名组成的数组

       *get_class_vars — 返回由类的默认属性组成的数组

       *get_class — 返回对象的类名

       get_declared_classes — 返回由已定义类的名字所组成的数组

       get_declared_interfaces — 返回一个数组包含所有已声明的接口

       *get_object_vars — 返回由对象属性组成的关联数组

       *get_parent_class — 返回对象或类的父类名

       interface_exists — 检查接口是否已被定义

       is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE

       *instanceof 类型运算符

       is_subclass_of — 如果此对象是该类的子类,则返回 TRUE

       **method_exists — 检查类的方法是否存在

       *property_exists — 检查对象或类是否具有该属性

=============================================

        

主板:mainboard   PCI插槽(规范) 

第三方生产

声卡: soundCard

网卡: networkCard

作业:

    1. 验证类的实现

       2. 默写02

预习:

   1. 多态的理解?

   2. 自动加载类函数__autoload(类名)

   3. 对象的串行化

  

  

 php面向对象中的实用类:

 ==================================================================

 1. Db.class.php 表数据信息操作类

 2. page.class.php  分页类

       方法:属性:URL地址、条件、总页数、总条数、页大小、当前 页

              构造方法(参数:总条数、页大小、条件)

              私有方法:计算最大页数、判断当前页数是否越界

              输出分页信息方法:(输出给Model类中limit方法使用)

              私有属性的getter方法(__GET());

              输出分页信息方法(输出HTML代码)(就是:【上一页】【下一页】。。。。)      

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

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

      

 5. 验证码类

 类在硬盘 ---加载---》对象在内存

 整节课重点内中摘要

 1.继承了一类之后,可以重写父类中的同名方法,在调用时,如果子类有,则使用子类中的方法

,否则

2.

三种方式

parent::test();  //parent表示父亲

A::test();  //A为类名,  ::表示范围

self::test();  //self则代表自己   ::表示范围

       ::表示范围

       parent -->父亲

       self   -->自己

       类名   -->表示指定的某一类

3.如何调用父类的构造方法

        parent::__construct(){}

       注意必须是子类构造方法中的第一行代码

public  protected   private    

如果子类重写(覆盖)父类的方法(同名方法),子类中的访问修饰符,必须大于或等于父类中的;

public > protected  > private

里氏替换原则  

4.类的自动加载

=====自己检测并包含的=====

一个类不能被包含两次

       include_once    PHP会去检测包涵了几次,效率很低.

       include 有错误代码产生警告,还会继续执行 

       include_once   确保一个文件只被包含一次

       require 有错误代码致命错误不会继续执行

       require_once

检测一个类是否存在

       class exists($string $class_name ,[bool(是否自动加载)])

=====自动检测并包含的=====  魔术方法 __autoload

       function __autoload($className){

              //echo $classNane;

              include "{$className}.class.php";

       }

!!!!!!!!文件命名 很重要(类名与文件名相同){$className}.class.php

5.抽象类

定义:不知道子类将如何实现某一方法,但子类必须拥有的这个方法时,我将这个方法定义为抽象方法.

如何抽象一个方法?  用abstract去修饰这个方法,并将方法的{}部分全部移除;

如果一个类中出现了abstract,那么这个类必须为abstract.

如何定义一个抽象类?用abstarct去修饰这个类.

特征

      抽象类,不能被实例化(不能被new)    因为里面可能含有抽象方法,这个抽象方法是没有方法体,不能被调用.

       一个抽象类中,可以没有抽象方法.

       但是抽象方法,只能出现在抽象类中

如何使用一个抽象类?

       通常会写个子类,去继承这个抽象类.

       一个子类,继承一个抽象类,必须要实现所有的抽象方法,才能被实例化.

       如果一个类,继承了抽象类,却没有实现所有的抽象方法,那么,这个子类,必须是抽象类.

abstract class A{

       public abstract function fly(){

       }

}

6.继承的单根性

       限制类型的对象.

       不能基本数据类型.

       只能填 对象, 数组

7.定义一个接口(定义一个类一样.)

       接口和抽象类很像,抽象类中,可以有普通方法,接口中,不能有.

       接口中,只有方法签名,熊有具体的方法实现(不能有花括号{},直接跟上分号),不用abstruct来修饰

      

       主要用于限制实现接口的类,必须拥有某些方法.

       有继承关系的,用抽象类限制,没有继承关系的,用接口去限制;

       一个类,可以实现多个接口,却只能继承一个父类.

      

       接口也不能被实例化(不能new一个接口)

       类中有属性,接口中,不能有属性.

      

       接口中,可以定义常量.

 interface (class) IPlay{

       public function paly();

 }

接口用来实现单继承所不能实现的功能

class Ball implements IPlay{

       public function play(){

                     echo '球正在跳';           

         }

}

重点: 在形参的前面加一个类型

public function play(Animal $boj){

       $obj->paly();

加的类型限制   限制变量为Animal的对象

}

8.const

对象中的常量,(属性,方法,常量);

函数中常量是全局的.

function test(){

       define('USER','root');

}

test();

echo USER;  输出为root

对象的常量,,用const定义的常量,实在类的范围中

class Foo{

       const PASS='12345';

       function a(){

              define('DBNAME','S01');

       }

      

}

       echo Foo::PASS 则输出'12345';

用defined定义的常量,是全局的

       只能在类的外面,函数中,或类的方法中

用const定义的常量,实在类的范围中的

       const 常量名=值  //像属性一样,写在类中

如何访问常量

       类名::常量名

       self::常量名    //使用本类中的常量

常量只能是标量

9.static

静态属性(变量)    

       在普通属性前,加一个static

       静态属性不属于某个对象,只属于某个类,所以访问时,用范围访问.

       类名::$静态属性名    注意如果少了$,就是在访问常量;

      

静态方法      

       在普通方法前,加一个static

       静态方法不属于某个对象,只属于某个类,所以不能使用$this

       类名::静态方法名();

       对象->静态方法();

       对象->普通方法;

       类名::普通的非静态方法();   //只要这个方法中,没有用到$this就可以.

      

普通方法一样,但是不能$this去调用

      

原文地址:https://www.cnblogs.com/wicub/p/3100461.html