OOP概述
- 对象和类
对象可以按类进行分类。类是表示彼此之前可能互有不同,但是必须具有一些共同点的对象集合。虽然类所包含的对象可能具有不同属性值,但是,这些对象都具有以相同方式实现的相同操作以及表示相同事物的相同属性
- 多态性
多态性是指不同类对同一操作可以有不同的行为和实现。多态性与其说是对象的特性,不如说是行为的特性
- 继承
继承允许我们使用子类在类之间创建层次关系。子类将从他的超类(也叫父类)继承属性和操作
类操作
- 类结构
一个最小的,最简单的类定义如下:class Person { }
- 构造函数
构造函数的声明与其他操作的声明一样,只是其名称必须是__construct()
,在创建一个对象时自动调用public function __construct() { echo "new Person"; }
- 析构函数
与构造函数相对的就是析构函数,析构函数允许在销毁一个类之前被调用,一个析构函数名称必须是__destruct()
,析构函数不能带有任何参数public function __destruct() { echo "gcc Person"; }
- 实例化
使用关键字new
来创建一个对象$a = new Person();
简单类
class Person{
private $name;
public function __construct($name){
$this->name=$name;
echo "new Person\n";
}
public function __destruct(){
echo "gcc Person\n";
}
public function show(){
echo $this->name;
}
public function getName(){
return $this->name;
}
public function setName($name){
$this->name = $name;
}
}
继承
- 要指定一个类成为另一个类的子类,可以使用
extends
关键字,PHP为单继承class B extends A { }
-
private
和protected
控制可见性
可以使用private
和protected
访问修饰符来控制需要继承的内容。如何一个方法和属性被指定为private
,它将不能被继承。如果一个属性或方法被指定为protected
,它将在类外部不可见,但是可以继承class A{ public function __construct(){ $this->fun1(); } private function fun1(){ echo "fun1\n"; } protected function fun2(){ echo "fun2\n"; } public function fun3(){ echo "fun3\n"; } } class B extends A{ public function __construct(){ $this->fun2(); } } $b = new B(); $b->fun3();
注:方法不修饰默认为public
-
final
关键字禁止继承和覆盖
PHP提供了final
关键字,当一个函数声明前面使用这个关键字时,这个歌函数将不能被任何子类覆盖。也可以使用final
关键字来禁止一个类被继承。final class A{ }
接口
使用接口(interface),可以指定某个类必须实现哪些方法,但不需要定义这些方法的具体内容。
接口是通过 interface 关键字来定义的,就像定义一个标准的类一样,但其中定义所有的方法都是空的。
接口中定义的所有方法都必须是公有,这是接口的特性。
interface IA{
function show();
}
class A implements IA {
function show(){
// TODO: Implement show() method.
}
}
Trait
Trait
是PHP一种代码复用机制,在Trait中,一个类可以组合多个Trait,而Trait可以继承其他Trait。Trait是代码重用最佳构建模块。
Trait和接口最大的不同就是:Trait包含了实现,而接口则不需要。
trait TA{
public function show($name){
echo "name is $name\n";
}
}
使用Trait,这需要使用use
关键字
class A {
use TA;
function speak(){
$this->show("Tom");
}
}
注:如果方法名相同,Trait方法会覆盖继承的方法,但当前方法会覆盖Trait的方法
高级功能
- 类常量
PHP提供了类级别常量,这个常量可以在不初始化该类的情况下使用。
可以通过class Math{ const pi = 3.14; } echo Math::pi;
::
操作符进行访问 - 静态方法
PHP允许使用static
关键字,可以在未初始化类的情况下调用方法class Math{ static public function add($a,$b){ return $a+$b; } } echo Math::add(1,2);
注:在一个静态方法中不可以使用this关键字
- 检查类类型和类型约束
instanceof
关键字允许检查一个对象的类型,它可以检查一个对象是否是特定类的实例,是否继承或实现了某个接口
PHP还提供了类类型提示功能,可以指定必须传入的参数类类型$a instanceof A;
public function add(A $a){ //... }
- 后期静态绑定
在相同函数有多个实现的继承层级中,可以使用后期静态绑定来确定调用具体类的方法
以上代码两次输出为A,使用后期静态绑定可以保证,调用在当前使用的类所提供实现class A { public static function showClass(){ echo __CLASS__; } public static function test(){ self::showClass(); } } class B extends A{ public static function showClass(){ echo __CLASS__; } } A::test(); B::test();
public static function test(){ static::showClass(); }
static
修饰符可以确保PHP使用了运行时调用的类 - 对象克隆
对象克隆可以通过clone关键字完成
将创建对想$b = clone $a;
$a
的副本,具有与$a
相同的类型与属性值,为浅拷贝
也可以使用非默认拷贝方法:在类中创建__clone()
方法class A { private $name; public function __clone(){ echo "copy"; $this->name = self::getName(); } public function getName(){ return $this->name; } } $a = new A(); $b= clone $a;
- 反射
可以通过ReflectionClass
实现反射$a = new ReflectionClass('A'); echo $a;
命名空间
命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径
虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。
- 定义
创建命名空间可以使用namespace
关键字<?php namespace MyProject; const CONNECT_OK = 1; class Connection { /* ... */ } function connect() { /* ... */ } ?>
- 命名空间导入和别名
通过别名引用或导入外部的完全限定名称,是命名空间的一个重要特征。use MyProject\Connection; $con = new Connection();
use MyProject\Connection as Con; $con = new Con();
网友评论