一、什么是面向对象
面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。
起初,“面向对象”是专指在程序设计中采用封装、继承、多态等设计方法。现在,面向对象的思想已经涉及到软件开发的各个方面。如,面向对象的分析(OOA,Object Oriented Analysis),面向对象的设计(OOD,Object Oriented Design)、以及我们经常说的面向对象的编程实现(OOP,Object Oriented Programming)。
面向对象的分析根据抽象关键的问题域来分解系统。面向对象的设计是一种提供符号设计系统的面向对象的实现过程,它用非常接近实际领域术语的方法把系统构造成“现实世界”的对象。面向对象程序设计(OOP)可以看作一种在程序中包含各种独立而又互相调用的对象的思想,这与传统的思想刚好相反:传统的程序设计主张将程序看作一系列函数的集合,或者直接就是一系列对电脑下达的指令。面向对象程序设计中的每一个对象都应该能够接受数据、处理数据并将数据传达给其它对象,因此它们都可以被看作一个小型的“机器”,即对象。
二、类和对象
类是面向对象程序设计的基本概念,通俗的理解类就是对现实中某一个种类的东西的抽象, 比如汽车可以抽象为一个类,汽车拥有名字、轮胎、速度、重量等属性,可以有换挡、前进、后退等操作方法。
1、通常定义一个汽车类的方法为:
//定义一个类:使用class关键字,在大括号内声明变量和方法
class Car {
public $name = "汽车"; //public指定作用范围。在类中定义成员变量,必须要指定作用范围。后续内容中有详细说明。
function getName() {
return $this->name; //使用"->"访问类的属性和方法(注意:name前没有使用$)。关于$this关键字的用法,下面有介绍
}
function stuThis() { //这个函数用于辅助说明this的用法
return $name;
}
}2、对象通过new关键字进行实例化:
//创建一个对象
$car = new Car();
$car->name = "奥迪A8"; //设置对象的属性值
echo $car->getName(); //调用对象的方法
//也可以使用变量创建对象,如:
$className = "Car";
$car2 = new $className;
NOTE:类和对象的区别:类是抽象的概念,对象是具体的实例。类可以使程序具有可重用性。
NOTE:类和对象的命名规则:一般情况类名首字母大写,类和对象的其他命名规则基本和变量命名规则一致。
3、$this关键字
$this是指向当前对象的指针。类的方法体内想访问调用者的属性,必须用$this。如果不加,则理解为方法内部的一个局部变量。
如:echo $car2 -> stuThis(); //会报错,错误信息为:Notice: Undefined variable: name in D:\PHPnow-1.5.6\XXXX\xxx.php on line 18
三、访问控制
对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或private(私有)来实现的。被定义为公有的类成员可以在任何地方被访问。被定义为受保护的类成员则可以被其自身以及其子类和父类访问。被定义为私有的类成员则只能被其定义所在的类访问。
1、类属性必须定义为公有,受保护,私有之一。如果用 var 定义,则被视为公有。
2、类中的方法可以被定义为公有,私有或受保护。如果没有设置这些关键字,则该方法默认为公有。
3、同一个类的对象即使不是同一个实例也可以互相访问对方的私有与受保护成员。这是由于在这些对象的内部具体实现的细节都是已知的。
四、构造函数和析构函数
1、构造函数
void __construct ([ mixed $args [, $... ]] )
具有构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
Note: 如果子类中定义了构造函数则不会隐式调用其父类的构造函数。要执行父类的构造函数,需要在子类的构造函数中调用 parent::__construct() 。如果子类没有定义构造函数则会如同一个普通的类方法一样从父类继承(假如没有被定义为 private 的话)。
2、析构函数
void __destruct ( void )
析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
和构造函数一样,父类的析构函数不会被引擎暗中调用。要执行父类的析构函数,必须在子类的析构函数体中显式调用 parent::__destruct() 。此外也和构造函数一样,子类如果自己没有定义析构函数则会继承父类的。
Note: 析构函数在脚本关闭时调用,此时所有的 HTTP 头信息已经发出。脚本关闭时的工作目录有可能和在 SAPI(如 apache)中时不同。
Note: 试图在析构函数(在脚本终止时被调用)中抛出一个异常会导致致命错误。
五、Static关键字
1、声明类属性或方法为静态,就可以不实例化类而直接访问,而是直接使用类名::方法名的方式进行调用。
2、静态属性不可以由对象通过 -> 操作符来访问(但静态方法可以)。
3、为了兼容 PHP 4,如果没有指定访问控制,属性和方法默认为公有。
4、由于静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用。
5、用静态方式调用一个非静态方法会导致一个 E_STRICT 级别的错误。 (这是官方手册中文翻译原话。我写代码验证时,有两种情况。一种是非静态方法中没有调用非静态变量时,不会报错;调用了时,会报错。所以建议不要这样做。)
6、就像其它所有的 PHP 静态变量一样,静态属性只能被初始化为文字或常量,不能使用表达式。所以可以把静态属性初始化为整数或数组,但不能初始化为另一个变量或函数返回值,也不能指向一个对象。
7、自 PHP 5.3.0 起,可以用一个变量来动态调用类。但该变量的值不能为关键字 self,parent 或 static。
<?php
/*
* Created on 2014-11-3
*
* To change the template for this generated file go to
* Window - Preferences - PHPeclipse - PHP - Code Templates
*/
header("Content-Type:text/html;charset=utf-8");
class Car{
static $name = "奥迪A9"; //静态属性
public $color = "黑色";
static function getName(){ //静态方法
//return $this->name; //错误用法,$this不可以在静态方法中使用
return self::$name; //静态方法中,$this伪变量不允许使用。可以使用self,parent,static在内部调用静态方法与属性。
}
public function test(){
return "我的车名:".self::$name.",颜色:".$this->color; //正确
//return $this->name; //错误用法。在这里虽然不报错,但在类外使用实例化的对象调用此方法时会报错
}
}
//直接使用类名::属性名、类名::方法名访问静态属性和静态方法
echo "我的车名字是:".Car::$name."<br />";
Car::getName();
$car = new Car();
//使用对象可以访问静态方法
echo $car->getName() ."<br />";
echo $car->test(); //测试$this
//echo Car::$color; //用静态方式访问非静态变量,报错!
//echo Car::test(); //错误用法。当在非静态方法test()中没有调用非静态变量时,不会报错。但当非静态方法test()中调用了非静态的变量时,程序会报错,报错行在类中test()方法体内调用非静态变量的地方
//$className = "Car";
//echo "我的车名字是:".$className::getName(); //自 PHP 5.3.0 起,可以用一个变量来动态调用类。而我现在的环境使用的是PHP5.2.14,所以这个暂时未验证。
?>
362

被折叠的 条评论
为什么被折叠?



