流水孟春
原创
面向对象已经弄了很久了,总结一下php的面向对象
一、接口(interface)
契约编程的时候用到接口和抽象类。
• 接口用interface来定义
• 接口的方法必须不能有函数体
• 接口的实现类必须实现接口所有的方法,包括参数,修饰符也必须一样
• 如果实现多个接口,那么被实现的接口不能用相同的方法(php不能是否是相同的方法只看方法名,不看修饰符和参数)
二、抽象类 (abstract)
当要定义一个类在继承的时候才实现并且必须实现某个方法的时候使用的。
• 只要用一个以上的抽象方法的类就必须用abstract修饰符
• 任何抽象方法实现的时候,访问限制必须更弱,比如protected修饰的抽象方法实现的时候必须是protected或public,不能是private
• 抽象类不能实例化
• 抽象方法不能有函数体
• 你可以通过不实现任何抽象方法并用abstract修饰符修饰来创建类继承一个抽象类
三、instanceof关键词
PHP 只有一个类型运算符:instanceof 用来测定一个给定的对象,它的父对象或它们所实现的接口是否来自指定的对象类。
instanceof 运算符是 PHP 5 引进的。在此之前用 is_a(),但是 is_a() 已经过时了,最好用 instanceof。
四、static关键字
1. 函数中的static
当函数中声明static变量时,程序运行生命周期内每次访问该静态变量都是共享该变量的,即每次访问该变量的数据都被保存下来供下次访问该变量的时候继续使用。
2. 类中static修饰的属性和方法的访问
a.在类内(当前类或子类)访问
在类内通过slef,parent以及类名用范围解析操作符(::)来访问静态属性和方法;
在类内可以用$this来访问静态方法(不推荐),但不能用$this来访问静态属性。
b.在类外访问
在类外通过类名以范围解析操作符,也叫作用域访问符(::)来访问静态属性和方法;
可以通过类的实例来访问静态方法,但不能这样访问静态属性。
3. 静态属性
如果不重写子类的属性的话,父类和子类已经他们的实例中共享静态属性;
重写子类的属性的话,self和parent关键词就生效了,这时候的该静态属性将不共享。
附:可以通过范围解析操作符(::)在该类内或该类外来访问非静态方法,但是这样不能访问非静态属性。
php6中还可以通过static::在类内来访问静态属性和静态方法。
五、const
• php5的类用const来定义类的常量
• 在类内用self,parent来访问该类的常量,
• 在类外只能通过"类名::常量"来访问类的常量,不能通过类的实例来访问类常量。
• 子类可以重定义常量
• 子类重定义常量后,在父类中实现通过self调用常量的方法在子类的实例中调用该方法的时候得到的是子类的常量的值
[注]php5.3后可以在类外通过::访问类常量
[测试代码]
<?php
class c {
const cc = '1234';
public function getCc(){
return self::cc;
}
}
class d extends c{
const cc = '12345678';
public function getCc2(){
return self::cc . ' - ' . parent::cc;
}
}
//print 'c::cc:' . c::cc;
$d = new d;
//$d->cc; // 抛出错误
print "\n";
print $d->getCc(); // 得到父类中的常量cc
print "\n";
print $d->getCc2();
六、魔术方法 Magic Methods
__construct, __destruct,__call, __get, __set, __isset, __unset,__sleep, __wakeup, __toString, __set_state, __clone, __autoload
1. 重载 overloading
php的重载和别的语言有很多不一样,是php一个特性
• 只有属性或方法未定义的时候,类的重载机制才被触发
• (属性重载)通过__get, __set, __isset and __unset来重载类的属性
• (方法重载)通过__call重载方法
• 所有重载的方法不能定义为static类型
• php5重载的方法被定义成public
• __call方法定义了你如何调用未经定义的方法. 你调用未定义方法时,方法名和方法接收的参数将会传给__call方法,
PHP传递__call的值返回给未定义的方法.
例子看php手册
2.
七、对象克隆
八、反射Reflection
阅读(978) | 评论(0) | 转发(0) |