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