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  ")\n" ;
 9         } else {
10             echo  "\$this is not defined.\n" ;
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());

 

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

posted @ 2016-03-21 20:30  xz小郑  阅读(172)  评论(0编辑  收藏  举报