php魔术方法总结

更新时间:2024-03-10 11:42:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

php魔术方法总结

1、操作类私有属性的方法:

__GET() 获取私有属性的值 __SET() 设置私有属性的值 __ISSET() 判断是否存在该属性 __UNSET() 删除该属性 使用示例:

class Person{

//私有成员

private $name; //人名 private $sex; //性别 private $age; //年龄

//__get()方法用来获取私有属性

private function __get($property_name){

if(isset($this->$property_name)){

return $this->$property_name; }else{

return NULL; } }

//__set()方法用来设置私有属性

private function __set($property_name, $value){

$this->$property_name = $value; return $this; }

}

2、__call()

监控一个对象中方法调用情况,若调用了不存在的、不在权限内的方法,会自动执行__call()中内容。

3、__autoload()

在该类实例化之前,自动加载所需的文件,使用示例: function __autoload($classname){

$classpath = \if(file_exists($classpath)){

require_once($classpath); }else{

die(‘class file ’.$classpath.’ not found! ’);

}

}

注意__autoload()抛出的异常不能被catch语句块捕获并导致致命错误。

4、__construct() 和 __destruct()

类的构造函数和析构函数,类实例化默认执行的代码全在__construct()里面。

__destruct()析构方法,PHP将在对象被销毁前(即从内存中清除前)调用这个方法默认情况下,PHP仅仅释放对象属性所占用的内存并销毁对象相关的资源.析构函数允许你在使用一个对象之后执行任意代码来清除内存.当PHP决定你的脚本不再与对象相关时,析构函数将被调用.在一个函数的命名空间内,这会发生在函数return的时候.对于全局变量,这发生于脚本结束的时候.如果你想明确地销毁一个对象,你可以给指向该对象的变量分配任何其它值.通常将变量赋值勤为NULL或者调用unset.

5、__clone():

当我们对一个实例化的对象进行浅复制时,对象内基本数值类型进行的是传值赋值,对象内的属性是传引用的复制,而不是生成新对象,意味着原对象属性值改变时,复制的对象属性值也会改变。

但是对__clone()处理过的属性,不会随源对象相应属性值的改变而改变。 例子:

class Account {

public $balance;

public function __construct($balance) { $this->balance = $balance; } }

class Person { private $id; private $name; private $age; public $account;

public function __construct($name, $age, Account $account) { $this->name = $name; $this->age = $age;

$this->account = $account; }

public function setId($id) { $this->id = $id; }

public function __clone() { #复制方法,可在里面定义再clone是进行的操作

$this->id = 0;

$this->account = clone $this->account; #不加这一句,account在clone是会只被复制引用,其中一个account的balance被修改另一个也同样会被修改 } }

$person = new Person(\ $person->setId(1);

$person2 = clone $person;

$person2->account->balance = 250;

var_dump($person, $person2); 5、__toString():

若类中定义__toString(),则该类实例化的对象,在被echo/print等输出该对象时,会自动返回__toString(){}中return的结果,不会报“对象不是字符串不能打印输出”之类的错误。

示例:

// Declare a simple class class TestClass {

public $foo;

public function __construct($foo) { $this->foo = $foo; }

//定义一个__toString方法,返加一个成员属性$foo public function __toString() { return $this->foo; } }

$class = new TestClass('Hello');

//直接输出对象

echo $class;

6、__sleep():串行化时候调用

__wakeup():反串行化时候调用

串行化基础知识:是指将一个变量(包括对象)转换成字节流的过程。串行化有效的解决了对象的保存和传输的问题。比如使用session过程中用session_register()注册对象,则每个php页面结束的时候都会自动序列化,并在后面加载的页面中自动解序列化出对象(serialize unserialize )。 可处理除指针外的所有数据类型。

反序列化时注意,所在的页面必须存在对该类的定义,否则就成了stdClass空类。

进行序列化之前,会检查该类中是否有__sleep函数,__sleep()必须返回一个需要序列化保存的成员属性数组,并且只序列化该函数返回的这些成员属性。两大作用:1、序列化之前关闭任何可能的数据库连接2、不需要被序列化的成员属性不必放在返回的属性数组中。

反序列化从字节流中创建对象后,马上检查__wakeup()是否存在并调用其中内容,作用为:重建序列化过程中可能丢失的数据库连接,其他初始化任务。

一般__wakeup()要处理序列化过程中__sleep()没有进行保存的对象属性。

示例:

class User{ public $name; public $id; function __construct(){ $this->id = uniqid(); //give user a unique ID 赋予一个不同的ID } function __sleep(){ return(array('name')); //do not serialize this->id 不串行化id } function __wakeup(){ $this->id = uniqid(); //give user a unique ID } }

$u = new User;

$u->name = 'HAHA';

$s = serialize($u); //serialize it 串行化 注意不串行化id属性,id的值被抛弃

$u2 = unserialize($s); //unserialize it 反串行化 id被重新赋值 //$u and $u2 have different IDs $u和$u2有不同的ID var_dump($u); var_dump($u2);

7、__set_state():

该函数只在php5.3及以后出现。

在调用var_export()函数时接收数组参数,最大作用是复制一个对象。 示例: class Test{

public $a;

static function __set_state($array) {//必须是静态方法,参数是一个数组

$tmp = new Test(); $tmp->a = $array['a'];//直接赋值 return $tmp;//必须返回一个对象,可以是其他类的对象 } }

$test = new Test(); $test->a = '我是$test';

eval('$b = '.var_export($test,true).';'); var_dump($b);

该例子会输出:object(Test)#2 (1) { [\我是$test\

8、__invoke():

Php5.3以后新增的魔术方法。

作用是创建实例后可以直接调用对象。(以函数方式) 示例:

class testClass{

public function __invoke($x){

Echo ‘data is: ’.$x; } }

$obj = new testClass; $obj(5);

9、__debugInfo():

php5.6及以后才有该方法。

__debugInfo中可以将类的所有属性值输出。 示例: class C{

private $prop;

public function __construct($val){

$this->prop = $val; }

public function __debugInfo(){

return array(‘propSquared’ => $this->prop**2); } }

var_dump(new C(5));

输出:

object(C)#1 (1) { [‘propSquared’]=>

int(25) }

本文来源:https://www.bwwdw.com/article/l4c8.html

Top