php面向对象的特性和java的思想是一样的,只不过一个是弱类型语言一个是强类型语言,
两者的实现还是有许多不同点的,功能上也只能点到即止,由于我两者经常搞混,
于是写这篇文章来总结一下php的面向对象的一些知识点,
方便日后查询;
class Person{
var $name;
private $age;
function Person(){ //老版构造方法,方法名和类名相同
// 构造函数在对象生成时首先自动执行的函数,一般用来初始化变量
}
function __construct(){ //php5新版构造方法
}
function __destruct(){ //析构函数
// 对象失去引用后自动执行的函数(引用放在栈中,对象放在堆中)
}
private function study(){
// 关键字private用来声明私有属性或方法,私有属性或方法不能被外部访问,
// 只有在类里面能够访问,并且私有的属性和方法不能被继承
}
protected function study(){
// 关键字protected用来声明受保护的属性或方法,受保护的属性或方法不能被外部访问,
// 只有在类里面能够访问,但受保护的的属性或方法可以被继承
}
public function study(){
// public声明共有的方法或属性,省略不写的函数或方法都是默认的public
}
常用的一些系统方法
__set() , __get() , __isset() , __unset();
__toString() , __clone() , __call() , __autoload();
function __get($name){
// 当外部试图访问对象私有属性的时候自动调用,并且接受的参数就是外部试图访问的属性名
}
function __set($name,$value){
// 当外部试图设置对象私有属性的时候自动调用,并且接受的参数是属性名和值
}
function __isset($name){
// 当外部使用isset()函数来测试一个对象的私有属性是否存在时执行的函数,自动接受测试的属性名
}
function __unset($name){
// 当外部使用unset()函数来试图删除一个对象的私有属性时自动调用,自动接受试图删除的属性名
}
function __toString(){
// 如果直接输出一个对象的引用(指针)的时候会自动调用本函数
return str; //必须返回一个字符串
}
function __clone(){
// 如果外部使用clone关键字克隆对象($a1=clone $a2)的话会自动调用本函数
// 可以用来初始化,此时的$this代表新克隆的对象$a1,代表被克隆对象的是$that
//$a1=clone $a2 区别于$a1=$a2,前者在堆中新创建了一个对象,后者只是同一个对象多了一个指针指向它
}
function __call($funName,$argus){
// 当调用一个对象不存在的方法时自动调用此函数,自动接受参数$funName(不存在的函数名)
// 参数$argus为数组
}
__autoload()函数:
这个函数不是写在对象里面的,是写在一个php文件的顶部用来自动加载这个php页面使用到的类
function __autoload($className){ include $className."php" //组装成一个完整路径 }
}
继承:
class Boy extends Person{
var $hoby;
function playgame(){
}
}
php中不支持函数重载,因为弱类型的原因,参数的类型不确定,因为php支持函数动态参数,
所以参数个数不确定,所以php中只能覆盖函数(方法重写)
方法重写:在子类方法中加上一句 paret::方法名();就把父类的方法里面的代码加入到新方法中了
php面向对象中的常见关键字:
final static const
final class Person{
// 加上关键字final的类不能被继承
final function study(){
// 使用final关键字的函数不能被重载(重写)
}
}
使用static修饰的方法或属性可以不用实例化对象直接使用类名::方法()或类名::属性
静态方法中不能使用非静态属性
const修饰常量:const NUM=100;常量名习惯大写
关键字$this和self
前者代表本对象,后者代表本类
对象的串行化和反串行化
串行化:serialize(value)
参数为对象名,函数的返回值为字符串
反串行化:unserialize(str)
参数为字符串,函数的返回值为对象
什么时候使用:1,在网络传输的时候,2,将对象写入文件或数据库的时候
部分串行化:
在对象中添加这个方法:
function __sleep(){
$arr = array("name","age"); //将要串行化的属性以数组的形式传入
return $arr;
}
在反串行化时自动调用这个方法(如果对象中没写则不调用):
function __wakeup(){
//类似于__clone(),主要是做一些初始化工作
}
抽象方法和抽象类:
抽象方法:abstract function abd();
只有方法名,没有方法体
含有抽象方法的类叫抽象类,也需要使用 abstract 关键字修饰
抽象类就是在普通类的基础上多了抽象方法
抽象类不能被实例化,只作为一个规范
继承抽象类的类必须实现里面的抽象方法,否则也是抽象类,不能实例化对象
接口:
接口的声明
interface demo{
}
所有成员属性必须是常量
所有方法都是抽象的
所有成员都必须是 public
一个类只能继承一个父类,但是可以实现多个接口
class one implements two{
}
php中的多态(和java不同)
通常php实现多态是这样的:通常父类是抽象类或者接口由子类去实现,那么
子类中就都含有相同的方法名,但是每个子类的实现不同
php面向对象