一、OOP的魔术工具
1、 __set()
给一个未定义的属性赋值时,或者给一个没有访问权限的属性赋值时,会调用__set()方法
2、__get()
当访问一个私有属性时,此方法会被自动调用
3、__autoload()
自动包含类文件,灵活引入类文件
4、__call()
可以屏蔽调用函数不存在的错误
5、__toString()
可以将对象以字符串的形式打印出来,该函数必须返回一个字符串
6、__clone()
在执行克隆操作时,会执行__clone()里的操作,里面的$this是副本的对象
class Book{
private $name;
private $price;
public function __construct($name,$price){
$this->name = $name;
$this->price = $price;
}
//访问一个私有权限或者没有定义的属性,调用此函数
public function __set($key,$value){
$this->$key = $value;
}
//访问一个私有权限的属性,调用此函数
public function __get($key){
return $this->$key;
}
//访问一个不存在的方法时,调用此函数
public function __call($method,$args){
echo $method.'方法不存在';
}
//当对象使用字符串形式输出时,调用此函数
public function __toString(){
return '这是一个书籍的类';
}
//当一个对象被克隆时,调用此函数
public function __clone(){
echo '一个对象被克隆了';
$this->name = '新书';
}
}
//实例化一个对象
$book = new Book('书','15.00');
//通过__get()方法访问一个私有属性
echo $book->name;//输出 书
//通过__set()方法设置一个私有属性
$book->name = '旧书';
echo $book->name;//输出 旧书
//尝试访问一个不存在的方法,会调用__call()方法
$book->setName();//输出 方法不存在
//输出对象
echo $book;//输出 这是一个书籍的类
//克隆一个对象,会调用__clone()方法,改变了新书的名字
$book2 = clone($book);
echo $book2->price;//和原书的价格一样 15.00
echo $book2->name;//输出 新书
二、类函数和对象函数
1、class_exists()
检查类是否存在
2、get_class()
获取对象的类名
3、get_class_methods()
获取类中公共的方法,参数为字符串类名或者对象变量
4、get_class_vars()
获取类中公共的属性
5、get_parent_class(‘NoteComputer’)
获取一个类的父类,参数为字符串类名或者对象变量
6、interface_exists(‘Person’)
判断接口是否存在
7、is_a()
判断对象是否属于这个类,或者判断这个对象的父类是否属于这个类
8、is_subclass_of()
判断对象是否是这个类的子类
9、method_exists()
判断对象是否有这个方法
//声明一个车类
class Car{
public $price; //价格
private $weight; //重量
public function move(){
echo '车子启动';
}
private function stop(){
echo '停车';
}
}
//声明一个自动汽车类,并继承车类
class AutoCar extends Car{
}
$car = new AutoCar();
//检查类是否存在
var_dump(class_exists('Car'));//结果为 bool(true)
//获取对象的类名
echo get_class($car);//结果为 AutoCar
//获取类中的公共方法
print_r(get_class_methods('AutoCar'));
print_r(get_class_methods($car));
//结果都为Array ( [0] => move )
//获取类中的公共属性
print_r(get_class_vars('AutoCar'));
//结果为Array ( [price] => )
//获取类的父类
echo get_parent_class('AutoCar');
echo get_parent_class($car);
//结果都为 Car
//判断接口是否存在
var_dump(interface_exists('Computer'));//结果为 bool(true)
//判断对象是否属于这个类,或者判断这个对象的父类是否属于这个类
var_dump(is_a($car,'AutoCar'));//结果为 bool(true)
var_dump(is_a($car,'Car'));//结果为 bool(true)
//判断对象是这个类的子类
var_dump(is_subclass_of($car,'Car'));//结果为 bool(true)
//判断对象是否有某种方法,公有,私有都可以判断
var_dump(method_exists($car,'stop'));//结果为 bool(true)