面向对象
面向对象编程(Object Oriented Programming, OOP, 面向对象程序设计)是一种计算机编程架构,OOP的一条基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成,OOP达到了软件工程的三 个目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。面向对象一直是软件开发领域内比较热门的话 题,首先,面向对象符合人类看待事物的一般规律。其次,采用面向对象方法可以使系统各部分各司其职、各尽所能。为编程人员敞开了一扇大门,使其编程的代码 更简洁、更易于维护,并且具有更强的可重用性。有人说PHP不是一个真正的面向对象的语言,这是事实。PHP 是一个混合型语言,你可以使用OOP,也可以使用传统的过程化编程。然而,对于大型项目,你可能需要在PHP 中使用纯的OOP去声明类,而且在你的项目里只用对象和类。这个概念我先不多说了,因为有很多人朋友远离面向对象编程的主要原因就是一接触面向对象概念的 时候就理解不上去, 所以就不想去学下去了. 等读者看完整体内容后再去把概念搞明白吧。
既然学习面向对象,那我们就先来了解什么事面向过程。
面向过程
“面向过程”(Procedure Oriented)是一种以过程为中心的编程思想。“面向过程”也可称之为“面向记录”编程思想,他们不支持丰富的“面向对象”特性(比如继承、多态),并且它们不允许混合持久化状态和域逻辑。
就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向过程的重要优势
可读性
可重用性
维护性
可测试性
面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。
面向对象是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。
例如下面的例子
可以明显地看出,面向对象是以功能来划分问题,而不是步骤。同样是绘制棋局,这样的行为在面向过程的设计中分散在了总多步骤中,很可能出现不同的绘制版本,因为通常设计人员会考虑到实际情况进行各种各样的简化。而面向对象的设计中,绘图只可能在棋盘对象中出现,从而保证了绘图的统一.
类与对象的关系
对象:对象是人们要进行研究的任何事物,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。
类:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。
对象和类的关系:
类与对象的关系就如模具和铸件的关系,类的实力化的结果就是对象,而对对象的抽象就是类,类描述了一组有相同特性(属性)和相同行为的对象。
php类的成员属性和成员方法
类定义的方法
<?php class phpClass { var $var1; var $var2 = "constant string"; function myfunc ($arg1, $arg2) { [..] } [..] } ?>
<?php class boy{ var $name ="jw"; var $age = "21"; var $sex = "男"; var $height = "182CM"; var $eye = "big"; //函数(成员方法) function zuofan(){ return "做饭<br>"; } function jiawu(){ return "家务<br>"; } }; ?>
注:在类的成员属性面前一定要有一个修饰词,如果不是知道使用声明修饰词,可以使用var(关键字),如果一旦有其他的修饰词就不要用var了
注意:成员属性不可以是带运算符的表达式.变量.方法或函数调用。声明的成员方法必须和对象相关,不能是一些没有意义的操作。
实例化对象
类的实例化格式如下:
$对象名 = new 类名称([参数]); // 类的实例化:类成为对象的语句
· $对象名:类实例化返回的对象名称,用于引用类中的方法。
· new:关键字,表明要创建一个新的对象。
· 类名称:表示类的名称。
· 参数:指定类的构造方法用于初始化类的值。如果类中没有定义构造函数,PHP会自动创建一个不带参数的默认构造函数。
new.php里提供的源代码,能清晰的看出如何实例化对象,并访问。
<?php class boy{ //变量(成员属性) var $name ="jw"; var $age = "21"; var $sex = "男"; var $height = "182CM"; var $eye = "big"; //函数(成员方法) function zuofan(){ return "做饭<br>"; } function jiawu(){ return "家务<br>"; } } $boy1 = new boy(); $boy1->name = "张三"; $boy2 = new boy(); $boy2 ->name = "李四"; echo $boy1 -> sex."<br>"; echo $boy2 -> height."<br>"; ?>
-> 符号 代表访问对象名下面的类。
特殊的对象引用“this”。
只要是对象里面的成员,就必须使用这个对象来访问这个对象内部的和方法。
<?php class boy{ //变量(成员属性) var $name ="jw"; var $age = "21"; var $sex = "男"; //函数(成员方法) public function zuofan(){ echo "{$this->name} 做饭<br>"; $this->jiawu(); } function jiawu(){ echo "家务<br>"; } } $boy1 = new boy(); $boy2 = new boy; $boy2 ->name = "李四"; $boy1->name = "张三"; $boy1->zuofan(); $boy2->zuofan(); ?>
构造方法
构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。
1.是对象创建完成,第一个自动调用的方法(特殊)
2.方法名称比较特殊,可以和类名相同名的方法名
3.给对象中的成员赋初值使用的.
<?php class boy{ //变量(成员属性) var $name; var $age; var $sex; function __construct($name,$age,$sex="男"){ $this->name="$name"; $this->age="$age"; $this->sex="$sex"; } //函数(成员方法) public function zuofan(){ echo "{$this->name} 做饭<br>"; $this->jiawu(); } function jiawu(){ echo "家务<br>"; } } $boy1 = new boy("名字",28); $boy2 = new boy("名",26,"男"); $boy1->zuofan(); $boy2->zuofan(); ?>
析构方法
析构函数(destructor) 与构造函数相反,当对象结束其生命周期时(例如对象所在的函数已调用完毕),系统自动执行析构函数。
PHP 5 引入了析构函数的概念,这类似于其它面向对象的语言,其语法格式如下:
void __destruct ( void )
继承
PHP 使用关键字 extends 来继承一个类,PHP 不支持多继承,格式如下:
<?php
class Child extends Parent {
// 代码部分
}
?>
访问控制
PHP 对属性或方法的访问控制,是通过在前面添加关键字 public(公有),protected(受保护)或 private(私有)来实现的。
· public(公有):公有的类成员可以在任何地方被访问。
· protected(受保护):受保护的类成员则可以被其自身以及其子类和父类访问。
· private(私有):私有的类成员则只能被其定义所在的类访问。
可查看public.php protected.php private.php查看区别
方法重写
方法重载(override)/覆盖——在什么情况下使用:当父类知道所有的子类都需要用到一个方法,但父类不知道怎么去写这个方法时,就需要用到方法的重载。这时候,可以让子类去重写,来覆盖这个方法。
通俗实例——父类(动物)知道其子类(猫和狗)都会叫,但它们的叫法都不一样,所以父类没法去写这个方法,只能让子类(猫和狗)去定义。代码如下:
<?php class Animal{ public $name; protected $price; function cry(){ echo "不知道动物怎么叫"; } } class Dog extends Animal{ function cry(){ echo "汪汪..."; } } class Pig extends Animal{ function cry(){ echo "哼哼..." } } ?>
接口
接口interface 是一个规定,给人继承用的东西,有点像抽象类
在里面定义的方法,却不去实例化,而需要别的类去implements 它,而且必须一一实现接口定义的所有方法,举个例子
interface Shop
{
public function buy($gid);
public function sell($gid);
public function view($gid);
}
我声明一个shop接口类,定义了三个方法:买(buy),卖(sell),看(view),那么继承此类的所有子类都必须实现这3个方法少一个都 不行,如果子类没有实现这些话,就无法运行。实际上接口类说白了,就是一个类的模板,一个类的规定,如果你属于这类,你就必须遵循我的规定,少一个都不 行,但是具体你怎么去做,我不管,那是你的事,如:
<?php class BaseShop implements Shop { public function buy($gid) { echo('你购买了ID为 :'.$gid.'的商品'); } public function sell($gid) echo('你卖了ID为 :'.$gid.'的商品'); } public function view($gid) { echo('你查看了ID为 :'.$gid.'的商品'); } } ?>
常量
可以把在类中始终保持不变的值定义为常量。在定义和使用常量的时候不需要使用 $ 符号。
常量的值必须是一个定值,不能是变量,类属性,数学运算的结果或函数调用。
<?php class MyClass { const constant = '常量值'; function showConstant() { echo self::constant . PHP_EOL; } } echo MyClass::constant . PHP_EOL; $classname = "MyClass"; echo $classname::constant . PHP_EOL; // 自 5.3.0 起 $class = new MyClass(); $class->showConstant(); echo $class::constant . PHP_EOL; // 自 PHP 5.3.0 起 ?>
php中::的意思
类中 静态方法和静态属性的引用方法
例如
<?php class Test{ public static $test = 1; public static function test(){ } } ?>
可以不用实例化对象直接使用 Test::$test 来取得$test属性的值
静态方法调用也同理Test::test(); 直接调用静态方法test
抽象类
对于PHP程序员来说,最为难掌握的一点要数PHP抽象类应用这一块知识点。作为一个新手其实也还没有到要用面向对象的知识去编程,但以后进行开发,使用类进行封装或者使用接口之类,把程序进行各种模块式的开发,这当然是必然的。
在自然语言中,我们理解抽象的概念是,一个物体的一种大的描述,这种描述对某类物体来说是共有的特性。那么在PHP中也是一样的,我们把一个类进行抽象,可以指明类的一般行为,这个类应该是一个模板,它指示它的子方法必须要实现的一些行为。
PHP抽象类应用的定义:
abstract class ClassName{
}
PHP抽象类应用要点:
1.定义一些方法,子类必须完全实现这个抽象中所有的方法
2.不能从抽象类创建对象,它的意义在于被扩展
3.抽象类通常具有抽象方法,方法中没有大括号
PHP抽象类应用重点:
1.抽象方法不必实现具体的功能,由子类来完成
2.在子类实现抽象类的方法时,其子类的可见性必须大于或等于抽象方法的定义
3.抽象类的方法可以有参数,也可以为空
4.如果抽象方法有参数,那么子类的实现也必须有相同的参数个数
PHP抽象类应用示例:
abstract public function_name(); //注意没有大括号
PHP抽象类规则:
1. 某个类只要至少含有一个抽象方法,就必须声明为抽象类
2. 抽象方法,不能够含有函数体
3. 继承抽象类的子类,实现抽象方法的,必须跟该抽象方法具有相同或者更低的访问级别
4. 继承抽象类的子类,如果不实现所有抽象方法,那么该子类也为抽象类
我们来实现一个简单的抽象类:计算矩形的面积。这个矩形可以从形状类扩展。
可查看abstract.php代码
Final 关键字
如果我们不希望一个类被继承,我们使用final来修饰这个类。这个类将无法被继承。
final---用于类、方法前。
final类---不可被继承。
final方法---不可被覆盖。
final类不能被继承。
当我们只希望一个类不可扩展时,可在类的前面加上Final,该类就不能被继承。
Static 关键字
php中的变量作用范围的另一个重要特性就是静态变量(static 变量)。静态变量仅在局部函数域中存在且只被初始化一次,当程序执行离开此作用域时,其值不会消失,会用上次执行的结果。
PHP_EOL
换行符
调用父类构造方法
parent::__construct() 。
PHP 不会在子类的构造方法中自动的调用父类的构造方法。要执行父类的构造方法,需要在子类的构造方法中调用