魔术方法:
__construct(),类的html' target='_blank'>构造函数__destruct(),类的析构函数__call(),在对象中调用一个不可访问方法时调用__callStatic(),用静态方式中调用一个不可访问方法时调用__get(),获得一个类的成员变量时调用__set(),设置一个类的成员变量时调用__isset(),当对不可访问属性调用isset()或empty()时调用__unset(),当对不可访问属性调用unset()时被调用。__sleep(),执行serialize()时,先会调用这个函数__wakeup(),执行unserialize()时,先会调用这个函数__toString(),类被当成字符串时的回应方法__invoke(),调用函数的方式调用一个对象时的回应方法__set_state(),调用var_export()导出类时,此静态方法会被调用。__clone(),当对象复制完成时调用
__construct()和__destruct()
构造函数和析构函数应该不陌生,他们在对象创建和消亡时被调用。例如我们需要打开一个文件,在对象创建时打开,对象消亡时关闭
?phpclass FileRead protected $handle = NULL; function __construct(){ $this- handle = fopen(...); function __destruct(){ fclose($this- handle);?
这两个方法在继承时可以扩展,例如:
?phpclass TmpFileRead extends FileRead function __construct(){ parent::__construct(); function __destruct(){ parent::__destruct();?
__call()和__callStatic()
在对象中调用一个不可访问方法时会调用这两个方法,后者为静态方法。这两个方法我们在可变方法(Variable functions)调用中可能会用到。
?phpclass MethodTest public function __call ($name, $arguments) { echo Calling object method $name . implode( , , $arguments). /n public static function __callStatic ($name, $arguments) { echo Calling static method $name . implode( , , $arguments). /n $obj = new MethodTest;$obj- runTest( in object context MethodTest::runTest( in static context ?
__get(),__set(),
__get属性是当访问对象中的属性不存在或者非公有属性的时候自动加载__get方法,参数只有一个name值,就是访问对象中
属性的名字。
__set是当给对象中一个属性赋值的时候如果该属性不存在或者非公有属性的时候就会自动加载__set方法。参数有两个,参数1是访问对象中不可被调用属性的名字,参数2是将要给赋值所传的参数,可以是数组,也可以是字符串
都具有公共可见性,非静态,举个小栗子方便理解:
?php * 清晰的认识__get() __set()class Example { //公有的属性 public $public = pub //受保护的 - 子类中该属性可用 protected $protected = pro //私有的 - 只能此类使用此属性 private $private = pri //当访问对象中的属性不存在或者非公有属性的时候自动加载__get()方法 public function __get($name){ return 调用__get()方法: .$name; //当给对象的一个属性赋值的时候如果该属性不存在或者是非公有属性则自动加载__set()方法 public function __set($name,$value){ echo /nname: .$name. ,value: .$value. /n $example = new Example;echo pre echo $example- public. /n echo $example- protected. /n echo $example- private. /n echo $example- other. /n echo hr $example- public = lic //这个赋值成功所有没有显示$example- protected = tec $example- private = vat $example- other = er echo br/
echo 打印 public 属性: .$example- public;
__isset()和__unset()
__isset()在对象中调用属性或者非类中调用属性使用isset()方法的时候如果没有或者非公有属性
就会自动执行isset()的方法
__unset()在对象中调用属性或者非类中调用属性使用unset()方法如果没有或者非公有属性就会
自动执行__unset()的调用,可以将不能调用的成员属性删除,如果没有在类中加入此方法就不能删除
对象中的任何私有成员,
一起举个小栗子先:
?php * 针对类中的魔术方法 __isset() 和 __unset() 的例子class Example { public $public; protected $protected; private $private; public function __construct(){ $this- public = pub $this- protected = pro $this- private = pri public function __isset($var){ echo 这里通过__isset()方法查看属性名为 .$var. /n public function __unset($var){ echo 这里通过__unset()方法要销毁属性名为 .$var. /n $exa = new Example;echo pre var_dump(isset($exa- public));echo /n var_dump(isset($exa- protected));echo /n var_dump(isset($exa- private));echo /n var_dump(isset($exa- noVar));echo /n echo hr/ unset($exa- public);var_dump($exa);echo /n unset($exa- protected);echo /n unset($exa- private);echo /n unset($exa- noVar);echo /n__sleep()和__wakeup()
当我们在执行serialize()和unserialize()时,会先调用这两个函数。例如我们在序列化一个对象时,这个对象有一个数据库链接,想要在反序列化中恢复链接状态,则可以通过重构这两个函数来实现链接的恢复。例子如下:
?phpclass Connection protected $link; private $server, $username, $password, $db; public function __construct($server, $username, $password, $db) $this- server = $server; $this- username = $username; $this- password = $password; $this- db = $db; $this- connect(); private function connect() $this- link = mysql_connect($this- server, $this- username, $this- password); mysql_select_db($this- db, $this- link); public function __sleep() return array( server , username , password , db public function __wakeup() $this- connect();?
__toString()
对象当成字符串时的回应方法。例如使用echo $obj;来输出一个对象
?php// Declare a simple classclass TestClass public function __toString() { return this is a object $class = new TestClass();echo $class;?
这个方法只能返回字符串,而且不可以在这个方法中抛出异常,否则会出现致命错误。
__invoke()
调用函数的方式调用一个对象时的回应方法。如下
?phpclass CallableClass function __invoke() { echo this is a object $obj = new CallableClass;var_dump(is_callable($obj));?
__set_state()
调用var_export()导出类时,此静态方法会被调用。
?phpclass A public $var1; public $var2; public static function __set_state ($an_array) { $obj = new A; $obj- var1 = $an_array[ var1 $obj- var2 = $an_array[ var2 return $obj;$a = new A;$a- var1 = 5;$a- var2 = foo var_dump(var_export($a));?
__clone()
当对象复制完成时调用。例如在设计模式详解及PHP实现:单例模式一文中提到的单例模式实现方式,利用这个函数来防止对象被克隆。
?phppublic class Singleton { private static $_instance = NULL; // 私有构造方法 private function __construct() {} public static function getInstance() { if (is_null(self::$_instance)) { self::$_instance = new Singleton(); return self::$_instance; // 防止克隆实例 public function __clone(){ die( Clone is not allowed. . E_USER_ERROR);?
魔术常量(Magic constants)
PHP中的常量大部分都是不变的,但是有8个常量会随着他们所在代码位置的变化而变化,这8个常量被称为魔术常量。
__LINE__,文件中的当前行号
__FILE__,文件的完整路径和文件名
__DIR__,文件所在的目录
__FUNCTION__,函数名称
__CLASS__,类的名称
__TRAIT__,Trait的名字
__METHOD__,类的方法名
__NAMESPACE__,当前命名空间的名称
这些魔术常量常常被用于获得当前环境信息或者记录日志。
相关推荐:
PHP常用的几个魔术方法
【php类与对象】魔术方法
以上就是php中魔术方法是什么?php魔术方法的使用总结(代码)的详细内容,PHP教程
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。
新闻热点
疑难解答