PHP通过类和方法等语言结构支持面向对象编程。同时也通过对象相关的函数和内置类为面向对象提花广泛的支持。
1. OOP的魔术方法
__autoload()内置方法来自动包含类文件。
当遇到试图实例化未知类的时候,会调用__autoload()方法,并将类名当作参数传递给它。
好处:类文件不需要一一引入;要实例化类的时候才引入,避免资源的浪费;不会漏掉哪个类。
function __autoload($_className){
require_once strtolower($_className).'.class.php';
}
$computer = new Computer();
$person = new Person();
echo $computer->_name;
$computer->_run();
__call()内置方法在类方法调用错误时自动调用并屏蔽错误显示。
class Computer{
function _run(){
echo '运行';
}
public function __call($_methodName,$_argList){
echo $_methodName.'()方法不存在';
var_dump($_argList);
}
}
$computer = new Computer();
$computer->_go();
__toString()内置方法来打印对象的引用。当打印对象的时候自动调用该方法。它必须返回一个字符串。
class Computer{
private function __toString(){
return '我是对象上的字符串';
}
}
$computer = new Computer();
echo $computer;
引用传递是两个或以上引用共用一个对象;独立实例是每个引用对应独立的对象。
使用克隆对象方法,会连带克隆被克隆对象的字段值,它在调用这个方法的时候会自动调用__clone()方法(该方法不能私有化private),处理新克隆出来的那个对象的参数值等。
class Computer{
public $_name = 'dell';
public function __clone(){
echo '克隆啦';
$this->_name = '联想';
}
}
$computer1 = new Computer();
$computer2 = clone $computer1;
echo $computer1->_name;
echo $computer2->_name;
2.检测类函数
class_exists()函数检测类是否存在。
<?php
class Computer{
}
echo class_exists('Computer');
?>
get_class()函数获取对象的类名。
class Computer{
}
$computer = new Computer();
echo get_class($computer);
get_class_methods()方法获取类中的公有方法,参数可以使用类名或者对象引用。
class Computer{
public function _run(){}
private function _go(){}
}
$computer = new Computer();
print_r(get_class_methods('Computer'));
get_class_vars()函数获取类中的公有字段,参数要是类名,对象引用不行。
print_r(get_class_vars('Computer'));
get_parent_class()函数获取子类的父类,如果没有返回false。它的传递参数对象引用或者类名都可以。
echo get_parent_class($notecomputer);
interface_exists()函数判断接口是否存在。
echo interface_exists('Person');
is_a()函数判断对象是是否是这个类或者是这个类的子类的。
echo is_a($notecomputer, 'Computer');
is_subclass_of()函数判断对象是否是类的子类。
echo is_subclass_of($notecomputer, 'Computer');
method_exists()函数判断对象中是否有这个方法。
echo method_exists($computer, '_run');
3.OOP的反射API
PHP类和对象函数并没有告诉我们类内部的所有一切,而只是报告了它们的公有成员。要充分了解一个类,需要知道其私有成员和保护成员,还要知道其方法所期望的参数。对此,使用反射API。
获取反射API的转储信息:
$rc = new ReflectionClass('Computer');
print_r(Reflection::export($rc));
获取内置的类库信息:
Reflection::export(new ReflectionClass('DateTime'));
获取类里某个元素:
$rc = new ReflectionClass('DateTime');
echo $rc->getName();
echo $rc->getFileName();
print_r($rc->getConstants());