PHP面向对象

来源:互联网 发布:托勒密王朝 知乎 编辑:程序博客网 时间:2024/06/08 08:40

面向对象的基本概念

类是属性和方法的集合,如人类(具有肤色身高属性,说话行走等方法),类是一个抽象模型

对象

对象是类的实例化,是一个具体的实体,如黄种人

面向对象的三大特点

封装性

也可以成为信息隐藏。将一个类的使用和实现分开,只保留有限的接口和方法与外部联系,用该类的人只需要知道如何使用不需要知道该类如何实现

继承性

类可以继承自另一个类(父类),并获得该类的属性和方法,并可以添加新的属性和方法,提高了代码重用性

多态性

是指一个类的多个对象,调用同一个方法可以获得不同响应

PHP与对象

类的定义

class Person{ //class关键字Person类名}

实例化

class Person{function goFootball($name,$age){echo $name."\n";if($age>16 && $age<40){echo "YES <br>";}else{echo "NO <br>";}}}$jack = new Person;  //实例化$jack->goFootball("tom",10); //通过-> 调用对象方法

成员变量

可以使用public、private、protected、static、final

类常量

conts PI = 3.1459;//conts关键字、常量名大写、不加$符号;
常量的调用不需要实例化,直接通过类名::调用
Person::PI

构造方法

可以随着实例的变化而初始化不同的属性值
class Person{public $name;public $age;public function __construct($name,$age){$this->name = $name;$this->age = $age;}function goFootball(){echo $this->name."\n";if($this->age>16 && $this->age<40){echo "YES <br>";}else{echo "NO <br>";}}
function __destruct(){//调用析构方法
echo "对象被销毁,释放内存"
};
}$p1 = new Person("tom",28);$p1->goFootball();


析构方法

__destruct(),被销毁时调用,作用是释放内存,不需要手动调用

继承

子类可以继承父类所有变量和方法已经构造方法,当子类被实例化,php会先在子类查找构造方法,如果没有再去父类查找构造方法
class Sports extends Person{function goFootball(){echo $this->name."\n";if($this->age>16 && $this->age<40){echo "YES <br>";}else{echo "NO <br>";}}}$p1 = new Sports("kami",10);$p1->goFootball();

多态

覆盖:子类重写父类方法
重载:同一方法名根据参数不同而返回不同结果

访问权限

public:公开,所有类都可访问
private:私有,仅本类可访问
protected:保护,仅本类和子类可访问
static:静态,不用实例化也可访问,数据不会被销毁
final:终极类,不可被继承、重写(静态方法只能调用静态变量)

抽象类

抽象类是一种不能被实例化的类,只能作为其他类的父类使用,使用abstract关键字来修饰,抽象类至少包含一个没有方法体的抽象方法,在子类中实现

接口

类只支持单继承,接口可以多重实现,使用interface关键字声明,子类通过implements关键字来实现接口,若实现多个接口则用‘,’隔开

克隆对象

在PHP5中将实例化对象赋值给一个变量时,这时这个变量是这个对象的引用,对象随变量改变而改变;
$p1 = new Person();$p2 = $p1    //此时$p2为$p1的引用
若想复制该对象则在赋值时使用clone关键字
$p1 = new Person();$p2 = clone $p1;     //此时$p2是$p1的一个副本,与$p1不再关联

若想使克隆的对象拥有自己的属性和方法,则在类中定义__clone()方法
public function __clone(){$this->a =2;}

对象比较

‘==’比较两个对象的内容;'==='比较两个对象的引用

对象检测

instanceof操作符检测某对象是否属于某类
if($p1 instanceof Person) echo "yes";

魔术方法

__construct():构造方法(类中使用)
__destruct():析构方法(类中使用)
__clone():克隆方法(对实例使用)

__set:当程序试图写入一个不存在或不可见的成员变量时执行(参数:变量名、值)
__get:当程序试图调用一个不存在或不可见的成员变量时执行(参数:变量名)
__call:当程序试图调用一个不存在或不可见的方法时执行(参数:方法名、参数[arr])

__sleep、__wakeup:当序列化对象时执行,清除对象并返回一个对象变量数组
$p1 = new Sports("kami",10);$ser1 = serialize($p1);//序列化对象echo $ser1;$un1 = unserialize($ser1);//反序列化对象echo $un1->name;
__toString:当使用echo或print输出对象时执行(若没有定义此方法,直接输出对象会出错)
注意:输出对象时echo或print后面只能接对象,不能有其他字符

__autoload:当程序读取一个当前文件不存在的类时执行,此方法获取当前文件不存在的类名,可以实现根据路径自动加载所需的类
function __autoload($class_name){$class_path = $class_name.'.class.php';if(file_exists($class_path)){include_once($class_path);echo "通过__autoload方法自动加载了类".$class_name."<br>";}else{echo "未找到".$class_path;}}
注意:应该养成把每一个完整的类保存为一个class.php文件的习惯


原创粉丝点击