php魔术方法总结
更新时间:2024-03-10 11:42:01 阅读量: 综合文库 文档下载
- Php魔术方法推荐度:
- 相关推荐
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) }
正在阅读:
php魔术方法总结03-10
集团公司HSE管理体系量化审核标准04-18
晋升申请书怎么写07-18
中职生寒假社会实践报告03-31
国际知名品牌手表线下活动方案05-14
电厂实习心得体会模板范本01-07
社会实践报告03-31
DXP2004的实训心得10-12
人教版2013八年级英语竞赛试题及答案05-13
2019年内蒙古巴彦淖尔中考数学试卷03-11
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 魔术
- 总结
- 方法
- php