PHP面向对象(OOP)的魔术方法和常用函数
一、OOP的魔术方法
__autoload()自动包含类文件
__autoload()应该被写成单个参数的方法
当PHP引擎遇到试图实例化未知类的操作时,会调用__autoload()方法,并将类名字符串作为参数传递给它
__autoload()解决了要引入多个类文件不需要一一引入,不会过多引入文件而造成浪费,不会由于遗漏引用某个类文件而报错
__autoload()应该写在所有实例化类语句之前,后面每实例化一个类但是该类文件并没有引入都会自动调用一次该函数
function __autoload( $_className ){
require $_className.'.class.php';
//下面每次实例化都会引入一个相应的类文件
}
$demo = new Computer ();
由于在开发项目中,不同的开发人员可能使用的类文件命名或者类文件存放目录不同
或者项目中可能使用第三方模块,在这些模块中可以已经使用了__autoload()函数
但是一个php文件中只能使用一个__autoload()函数,可能引起调用文件错误
这时我们就需要自定义自动加载函数,定义好以后我们需要告知php内核我们自定义的自动加载函数名即可
使用spl_autoload_register('自定义自动加载函数名')即可告知php内核在自动加载时运行我们自定义的函数
一旦我们重新注册了自定义自动加载函数,那么__autoload()函数就不起作用了
__autoload()函数就变为了普通函数,与一个php文件中只能使用一个__autoload()函数不同,php允许注册多个自动加载函数,并且这些注册过的自动加载函数同时生效,在需要类时,会依照注册的顺序逐一的调用自动加载函数
属性重载:
当访问或操作没有权限或不存在的属性时会自动调用魔术方法
__set()、__get()、__isset()、__unset()(也称为拦截器)来完成操作
这个过程称为属性重载:
class Computer {
private $_name ;
function __set($_key , $_value){$this -> $_key = $_value ;}// 所有字段的赋值都在这里进行
function __get($_key){return $this -> $_key ;}// 所有字段的取值都在这里进行
function __isset($_key){return ture;} // 所有判断字段是否存在都在这里进行
function __unset($_key){unset($this -> $_key);} // 所有删除字段都在这里进行
}
属性重载的魔术方法不管是公有的还是私有的不会影响使用
当实例中调用类中的字段或方法时,指针会先指向类中的字段名,如果该字段是公有的则直接操作,如果是私有的话则寻找是否有对应的魔术方法,有则按照函数操作,没有则报错。所以如果需要该魔术方法建议设置为私有
方法重载:
当访问或操作没有权限或不存在的方法时会自动调用魔术方法
__call()、__callStatic()来完成操作
__call()针对对象,当访问对象的没有权限或不存在方法时自动调用
该方法必须包含两个参数,否则报错,第一个参数$_methodName为调用错误的的方法名称,第二个参数$args为调用方法时传入的参数(以数组形式返回)
__callStatic()方法必须设置为静态方法,即static __callStatic(){}
针对类,当访问一个没有权限或不存在的静态方法时自动调用,该方法的使用和__call()相同
__toString()内置方法来处理打印对象
当打印对象的时候会自动调用__toString()方法
class Computer {
public function __toString(){return '打印对象错的输出';}
//该函数修饰符必须是public,否则报错
}
echo new Computer();
__clone()内置方法来调整对象的克隆行为
当一个对象被克隆的时候自动执行__clone()方法,而复制的对象可以在其方法体内进行调整
class Computer {
public $_name ;
public function __clone(){$this ->_name = 'ibm' ;}
//修饰符必须是public,否则报错
}
$computer1 = new Computer();
$computer1 ->_name = 'dell' ;
$computer2 = clone $computer1 ; //用clone关键字对引用对象的克隆
echo $computer2 ->_name; //输出ibm,而不会输出dell,因为执行了__clone()方法
二. 类函数和对象函数
PHP提供了一系列强大的函数来检测类和对象,以便在第三方系统,运行时知道正在使用的是哪个
class_exists(string $className):检查类是否已定义
interface_exists(string $interface_name[,bool $autoload=true])
检查接口是否已被定义
autoload如果原始类没有加载,是否使用自动加载
property_exists(mixed $class,string $property);
检查对象或类是否具有该字段或当前是否具有访问权限
isset()判断时如果属性没有初始化(赋值)(没有赋值默认为NULL)会返回false
method_exists(mixed $class,string $method_name);
检查类或实例的方法是否存在
$class可以是类名也可是是对象实例
get_class(object $obj):返回对象的类名
get_parent_class():返回对象或类的父类名,没有父类会返回false
get_class_methods():返回对象或类的公共方法名组成的数组
get_class_vars(string $className):返回由类的默认字段(公共)及值组成的数组
get_object_vars(object $obj):返回由对象中定义的字段及值组成的数组
is_a(object $object,string $class_name):如果对象属于该类或该类是此对象的父类则返回TRUE
is_subclass_of(object $object,string $class_name):如果此对象所属类是该类的子类,则返回TRUE
get_declared_classes():返回当前脚本中已定义类的名字所组成的数组
get_declared_interfaces():返回当前脚本中已声明的接口的名字组成的数组
class_alias (string $original , string $alias [, bool $autoload = TRUE ] )
创建类的别名,这个别名类和原有的类完全相同
函数返回一个bool值
original原有的类名。 alias类的别名
autoload如果原始类没有加载,是否使用自动加载
trait_exists(string $traitname[,bool $autoload=TRUE]):检查指定的 trait 是否存在
get_declared_traits():返回所有已定义的 traits 的数组
get_called_class():获取调用该方法的类的名称