面向对象的基本概念
类
类是属性和方法的集合,如人类(具有肤色身高属性,说话行走等方法),类是一个抽象模型
对象
对象是类的实例化,是一个具体的实体,如黄种人
面向对象的三大特点
封装性
也可以成为信息隐藏。将一个类的使用和实现分开,只保留有限的接口和方法与外部联系,用该类的人只需要知道如何使用不需要知道该类如何实现
继承性
类可以继承自另一个类(父类),并获得该类的属性和方法,并可以添加新的属性和方法,提高了代码重用性
多态性
是指一个类的多个对象,调用同一个方法可以获得不同响应
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文件的习惯