zoukankan      html  css  js  c++  java
  • 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());

     值得注意的是,代码的重用性和代码的思路!

  • 相关阅读:
    BestCoder6 1002 Goffi and Squary Partition(hdu 4982) 解题报告
    codeforces 31C Schedule 解题报告
    codeforces 462C Appleman and Toastman 解题报告
    codeforces 460C. Present 解题报告
    BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告
    BestCoder3 1001 Task schedule(hdu 4907) 解题报告
    poj 1195 Mobile phones 解题报告
    二维树状数组 探索进行中
    codeforces 460B Little Dima and Equation 解题报告
    通过Sql语句控制SQLite数据库增删改查
  • 原文地址:https://www.cnblogs.com/zhengfengyun/p/5303512.html
Copyright © 2011-2022 走看看