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

时间:2023-03-10 04:27:52
PHP学习(三)----面向对象

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

  1.什么是面向对象?

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

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

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

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

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

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

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

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

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

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

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

  4.语法:

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

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

 class  SimpleClass
{
// property declaration
public $var = 'a default value' ; // method declaration
public function displayVar () {
echo $this -> var ;
}
}

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

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

    (2)$this 关键字

 class  A
{
function foo ()
{
if (isset( $this )) {
echo '$this is defined (' ;
echo get_class ( $this );
echo ")\n" ;
} else {
echo "\$this is not defined.\n" ;
}
}
} class B
{
function bar ()
{
// Note: the next line will issue a warning if E_STRICT is enabled.
A :: foo ();
}
} $a = new A ();
$a -> foo (); // Note: the next line will issue a warning if E_STRICT is enabled.
A :: foo ();//这样虽然可以调用但是不是标准的,会出现警告
$b = new B ();
$b -> bar (); // Note: the next line will issue a warning if E_STRICT is enabled.
B :: bar ();

结果:

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

$this is not defined.

$this is defined (B)

$this is not defined.

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

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

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

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

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

 class SimpleClass{
public $name="小明";
public $age=28;
public function __construct($name,$age){
echo "我被调用了!";
$this->name=$name;
$this->age=$age;
}
}
$newClass=new SimpleClass("小张",40);
echo "<br/>";
echo $newClass->name;
echo "<br/>";
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关键字

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

 class SimpleClass{
const PI=3.1415926;
}
echo SimpleClass::PI;
//3.1415926

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

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

 //计算两个圆的面积差
//面向过程:
$radius_1=20;
$radius_2=40;
$area_1=3.14*$radius_1*$radius_1;
$area_2=3.14*$radius_2*$radius_2;
echo "面积差是:".($area_2-$area_1);
echo "<br/>";
//面向对象:
class circle{
//定义圆的类
public $radius;
public function getArea(){
return 3.14*$this->radius*$this->radius;
}
function __construct($radius){
$this->radius=$radius;
}
}
//实例不同的圆对象
$circle_1=new circle(40);
$circle_2=new circle(20);
echo "面积差是:".($circle_1->getArea()-$circle_2->getArea());

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