• php整理(三): 面向对象


    PHP学习(三)----面向对象

     

    首先,还是建立一个好的理解模型: 

      1.什么是面向对象?

        面向对象分为两个部分,那就是:什么是对象和什么是面向?

        什么是对象: 对象的出现就是为了用代码更好的绘制我们现有的世界.那到底什么是对象呢? 一句话,万物皆对象!不管是真实存在的还是抽象的事物,都是对象. 都可以把他们抽象为数据模型(属性或成员变量)和对象的行为这两个部分.

        什么是面向:在写代码的时候,把对象放在第一位, 什么都是对象,什么都可以做成对象.把生活中的对象都用对象的方式进行存储(属性和方法).

      2.对象通过自身的属性和行为,以及与其他对象的交互,从而实现利用对象对世界的描述

      只是简单的片面的理解,以后还得深究和丰富

      3.面向对象的三大特性:

        封装:把对象的属性和操作(或服务或行为或方法)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节(尽可能的隐藏属性和方法).从而达到保证了数据的完整性和数据的安全性;

        继承:继承是从已有的类中派生出新的类,新的类能吸收已有类的数据属性和行为,并能扩展新的能力.主要的目的就是提高代码的重用性.在PHP中,继承将会影响到类与类,对象与对象之间的关系。比如,当      扩展一个类,子类就会继承父类所有公有的和受保护的方法。除非子类覆盖了父类的方法,被继承的方法都会保留其原有功能。继承对于功能的设计和抽象是非常有用的,而且对于类似的对象增加新功能      就无须重新再写这些公用的功能。

        多态:父类引用指向子类实例,由于子类的不同,所表现出的差别(这个属性是最不好理解的).试着去理解:举一个生活中的例子:比方说按下 F1 键这个动作,如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文      档;如果当前在 Word 下弹出的就是 Word 帮助;在 Windows 下弹出的就是 Windows 帮助和支持。同一个事件发生在不同的对象上会产生不同的结果。

          实现多态的条件:(一)要有继承;(二)要有重写;(三)父类引用指向子类对象。也可以简单理解为父类在不同情况先表现出来的不同的形态

          作用:消除类型之间的耦合关系。(不是很懂)

      4.语法:

        (1)建立一个对象需要一个类.类就是对对象的抽象,主要是用力实例化各种各样的对象的.对于类要尽量: 对内高聚合和对外低耦合.

          什么是类:每个类的定义都以关键字 class 开头,后面跟着类名,后面跟着一对花括号,里面包含有类的属性与方法的定义。

    复制代码
     1 class  SimpleClass
     2  {
     3      // property declaration
     4      public  $var  =  'a default value' ;
     5 
     6      // method declaration
     7      public function  displayVar () {
     8         echo  $this -> var ;
     9     }
    10 }
    复制代码

        上面创建了一个类,下面我们来实例化一个对象

    1 $instance = new SimpleClass();//实例化一个对象

        (2)$this 关键字

    复制代码
     1 class  A
     2  {
     3     function  foo ()
     4     {
     5         if (isset( $this )) {
     6             echo  '$this is defined (' ;
     7             echo  get_class ( $this );
     8             echo  ")
    " ;
     9         } else {
    10             echo  "$this is not defined.
    " ;
    11         }
    12     }
    13 }
    14 
    15 class  B
    16  {
    17     function  bar ()
    18     {
    19          // Note: the next line will issue a warning if E_STRICT is enabled.
    20          A :: foo ();
    21     }
    22 }
    23 
    24  $a  = new  A ();
    25  $a -> foo ();
    26 
    27  // Note: the next line will issue a warning if E_STRICT is enabled.
    28  A :: foo ();//这样虽然可以调用但是不是标准的,会出现警告
    29  $b  = new  B ();
    30  $b -> bar ();
    31 
    32  // Note: the next line will issue a warning if E_STRICT is enabled.
    33  B :: bar ();
    复制代码

    结果:

    $this is defined (A)//说明$this是代表对象本身

    $this is not defined.

    $this is defined (B)

    $this is not defined.

        (3)new关键词,用来实例化对象

    1 $assigned    =   $instance ;//相当于传递的对象,就是同一个对象有两个名字 $instance=mull,不会调用析构函数,只有assingned和$instance都是null的时候才调用析构函数,因为他们是两个对象
    2  $reference   =&  $instance ;//引用被传递,还是一个对象,引用地址和实例对象完全相同,$reference=null,调用析构函数销毁对象,因为他们实际是一个对象

           在实例对象的时候,要用到构造函数,每一个类都有一个默认的构造函数,就是从Object继承过来的构造函数,声明自己构造函数就是重写了父对象的构造函数

          __construct(){};------这就是构造函数(带__是系统的函数,又称为魔法函数,PHP5之后出现的,之前就是和JAVA中很类似的构造函数);构造函数的主要作用就是 来实例化对象并对对象进行初始化的

          __destruct(){};-------这是析构函数,与构造函数相对性,用来销毁对象的,当对象没有任何引用的时候,自动调用该函数,也可以声明对象为空($obj=null)来手动调用该函数

    复制代码
     1 class SimpleClass{
     2     public $name="小明";
     3     public $age=28;
     4     public function __construct($name,$age){
     5         echo "我被调用了!";
     6         $this->name=$name;
     7         $this->age=$age;
     8     }
     9 }
    10 $newClass=new SimpleClass("小张",40);
    11 echo "<br/>";
    12 echo $newClass->name;
    13 echo "<br/>";
    14 echo $newClass->age;
    复制代码

    结果:

    我被调用了!
    小张
    40

          (4)extends关键词,单继承:被继承的方法和属性可以通过用同样的名字重新声明被覆盖,但是如果父类定义方法时使用了 final,则该方法不可被覆盖。在子类中,可以通过 parent:: 来访问被覆盖的方法或属性。当覆盖方法时,参数必须保持一致否则 PHP 将发出 E_STRICT 级别的错误信息。但构造函数例外,构造函数可在被覆盖时使用不同的参数。

           访问权限:

            对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。

            类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。

          (5)static关键字

          声明类属性或方法为静态,就可以不实例化类而直接访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。静态属性不可以由对象通过 -> 操作符来访问。用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。

          (6)final关键字

          PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。 

          (7)const关键字

          来声明常量,常量属于类,可以用类名进行访问;常量在定义的时候就被初始化,且以后不能被改变,没有$符号   

    1 class SimpleClass{
    2     const PI=3.1415926;
    3 }
    4 echo SimpleClass::PI;
    5 //3.1415926

    还有很多需要理解的东西------2016.3.22

     面向对象和面向过程的区别(得好好体会)

    复制代码
     1 //计算两个圆的面积差
     2 //面向过程:
     3 $radius_1=20;
     4 $radius_2=40;
     5 $area_1=3.14*$radius_1*$radius_1;
     6 $area_2=3.14*$radius_2*$radius_2;
     7 echo "面积差是:".($area_2-$area_1);
     8 echo "<br/>";
     9 //面向对象:
    10 class circle{
    11     //定义圆的类
    12     public $radius;
    13     public function getArea(){
    14         return 3.14*$this->radius*$this->radius;
    15     }
    16    function __construct($radius){
    17        $this->radius=$radius;
    18    }
    19 }
    20  //实例不同的圆对象
    21    $circle_1=new circle(40);
    22    $circle_2=new circle(20);
    23    echo "面积差是:".($circle_1->getArea()-$circle_2->getArea());
    复制代码
  • 相关阅读:
    BZOJ3252攻略——长链剖分+贪心
    BZOJ3522[Poi2014]Hotel——树形DP
    BZOJ4012[HNOI2015]开店——树链剖分+可持久化线段树/动态点分治+vector
    BZOJ3626[LNOI2014]LCA——树链剖分+线段树
    BZOJ2157旅游——树链剖分+线段树
    BZOJ3531[Sdoi2014]旅行——树链剖分+线段树
    BZOJ2243[SDOI2011]染色——树链剖分+线段树
    zookeeper(1)初识zookeeper
    任督二脉
    RPC框架之RMI
  • 原文地址:https://www.cnblogs.com/hellodp/p/5440491.html
Copyright © 2020-2023  润新知