PHP中魔术方法的用法
PHP中魔术方法的用法
/** PHP把所有以__(两个下划线)开头的类方法当成魔术方法。所以你定义自己的类方法时,不要以 __为前缀。 * */// __toString、__set、__get__isset()、__unset()
/*The __toString method allows a class to decide how it will react when it is converted to a string.__set() is run when writing data to inaccessible members.__get() is utilized for reading data from inaccessible members.__isset() is triggered by calling isset() or empty() on inaccessible members.__unset() is invoked when unset() is used on inaccessible members.*/
class TestClass {private $data = array();public $foo;public function __construct($foo) {$this->foo = $foo;}public function __toString() {return $this->foo;}public function __set($name, $value) {echo "__set, Setting '$name' to '$value'\n";$this->data[$name] = $value;}public function __get($name) {echo "__get, Getting '$name'\n";if (array_key_exists($name, $this->data)) {return $this->data[$name];}}/** As of PHP 5.1.0 */public function __isset($name) {echo "__isset, Is '$name' set?\n";return isset($this->data[$name]);}/** As of PHP 5.1.0 */public function __unset($name) {echo "__unset, Unsetting '$name'\n";unset($this->data[$name]);}}$obj = new TestClass('Hello');
echo "__toString, $obj\n";
$obj->a = 1;
echo $obj->a . "\n\n";
var_dump(isset($obj->a));
unset($obj->a);
var_dump(isset($obj->a));
echo "\n\n";
/**输出结果如下:__toString, Hello__set, Setting 'a' to '1'__get, Getting 'a'__isset, Is 'a' set?bool(true)__unset, Unsetting 'a'__isset, Is 'a' set?bool(false)**/// __call __callStatic
/*mixed __call ( string $name , array $arguments )mixed __callStatic ( string $name , array $arguments )__call() is triggered when invoking inaccessible methods in an object context.__callStatic() is triggered when invoking inaccessible methods in a static context.The $name argument is the name of the method being called.The $arguments argument is an enumerated array containing the parameters passed to the $name'ed method.*/
class MethodTest {public function __call($name, $arguments) {// Note: value of $name is case sensitive.echo "__call, Calling object method '$name' " . implode(', ', $arguments) . "\n";}/** As of PHP 5.3.0 */public static function __callStatic($name, $arguments) {// Note: value of $name is case sensitive.echo "__callStatic, Calling static method '$name' " . implode(', ', $arguments) . "\n";}}$obj = new MethodTest;
$obj->runTest('in object context', 'param2', 'param3');
//MethodTest::runTest('in static context'); // As of PHP 5.3.0
echo "\n\n";
/**输出结果如下:__call, Calling object method 'runTest' in object context, param2, param3string(10) "__invoke: "*/// __invoke
/* The __invoke method is called when a script tries to call an object as a function.Note: This feature is available since PHP 5.3.0.
*/
class CallableClass {function __invoke($x) {var_dump($x);}
}$obj = new CallableClass;
//$obj(5);
var_dump('__invoke: ' . is_callable($obj));
echo "\n\n"; // __sleep __wakeup
/*串行化serialize可以把变量包括对象,转化成连续bytes数据. 你可以将串行化后的变量存在一个文件里或在网络上传输. 然后再反串行化还原为原来的数据. 你在反串行化类的对象之前定义的类,PHP可以成功地存储其对象的属性和方法. 有时你可能需要一个对象在反串行化后立即执行. 为了这样的目的,PHP会自动寻找__sleep和__wakeup方法.当一个对象被串行化,PHP会调用__sleep方法(如果存在的话). 在反串行化一个对象后,PHP 会调用__wakeup方法. 这两个方法都不接受参数. __sleep方法必须返回一个数组,包含需要串行化的属性. PHP会抛弃其它属性的值. 如果没有__sleep方法,PHP将保存所有属性.下面的例子显示了如何用__sleep和__wakeup方法来串行化一个对象. Id属性是一个不打算保留在对象中的临时属性. __sleep方法保证在串行化的对象中不包含id属性. 当反串行化一个User对象,__wakeup方法建立id属性的新值. 这个例子被设计成自我保持. 在实际开发中,你可能发现包含资源(如图像或数据流)的对象需要这些方法*/class User {public $name;public $id;function __construct() {//give user a unique ID 赋予一个差别 的ID$this->id = uniqid();}//__sleep返回值的类型是数组,数组中的值是不需要串型化的字段idfunction __sleep() {//do not serialize this->id 不串行化idreturn(array("name"));}function __wakeup() {//give user a unique ID$this->id = uniqid();}}//create object 成立一个器材
$u = new User;
$u->name = "Leon"; //serialize it 串行化 留意不串行化id属性,id的值被遗弃
$s = serialize($u);
echo "__sleep, __wakeup, s: $s"; //unserialize it 反串行化 id被重新赋值
$u2 = unserialize($s); //$u and $u2 have different IDs $u和$u2有差别 的ID
print_r($u);
print_r($u2);
echo "\n\n";
/**输出结果如下:__sleep, __wakeup, s: O:4:"User":1:{s:4:"name";s:4:"Leon";}User Object([name] => Leon[id] => 4db1b17640da1)User Object([name] => Leon[id] => 4db1b17640dbc)*/// __set_state
/*This static method is called for classes exported by var_export() since PHP 5.1.0.The only parameter of this method is an array containing exported properties in the form array('property' => value, ...).*/class A {public $var1;public $var2;public static function __set_state($an_array) { // As of PHP 5.1.0//$an_array打印出来是数组,而不是调用时传递的对象print_r($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';
echo "__set_state:\n";
eval('$b = ' . var_export($a, true) . ';');
// $b = A::__set_state(array(
// 'var1' => 5,
// 'var2' => 'foo',
// ));
var_dump($b);
echo "\n\n";
/**输出结果如下:__set_state:Array([var1] => 5[var2] => foo)object(A)#5 (2) {["var1"]=>int(5)["var2"]=>string(3) "foo"}*/// __clone
class SubObject {static $instances = 0;public $instance;public function __construct() {$this->instance = ++self::$instances;}public function __clone() {$this->instance = ++self::$instances;}}class MyCloneable {public $object1;public $object2;function __clone() {// Force a copy of this->object, otherwise// it will point to same object.$this->object1 = clone $this->object1;}}$obj = new MyCloneable();
$obj->object1 = new SubObject();
$obj->object2 = new SubObject();
$obj2 = clone $obj;
print("__clone, Original Object:\n");
print_r($obj);
print("__clone, Cloned Object:\n");
print_r($obj2);
echo "\n\n";
/**输出结果如下:__clone, Original Object:MyCloneable Object([object1] => SubObject Object([instance] => 1) [object2] => SubObject Object([instance] => 2))__clone, Cloned Object:MyCloneable Object([object1] => SubObject Object([instance] => 3) [object2] => SubObject Object([instance] => 2)) */
相关文章:

“互联网+”的时代,易佳互联也随着时代步伐前进着
一谈到互联网,我想大家的心里都不陌生,咱们总理工作报告中提出,制定“互联网”行动计划,推动移动互联网、云计算、大数据、物联网等与现代制造业结合,促进电子商务、工业互联网和互联网金融健康发展,引导互…

PHP 获取数组最后一个值
<?PHP$array array(1,2,4,6,8);echo end($array);?> <?PHP$array array(1,2,4,6,8);echo array_pop($array);?> <?PHP$array array(1,2,4,6,8);$k array_slice($array,-1,1);print_r($k); //结果是一维数组?>

解决nginx 502 bad gateway--团队的力量
nginx 502 bad gateway可以采取客户端强制刷新的方法,但是真正的解决要么改配置或者放CDN上。遇到这个问题,首先是有人发现可以加index.html访问,因为我们是线上网站,没有太多时间去研究,所以先临时这样;然…

MYSQL企业常用架构与调优经验分享
小道消息:2016爱维Linux高薪实战运维提高班全新登场,课程大纲:http://www.iivey.com/666-2一、选择Percona Server、MariaDB还是MYSQL1、Mysql三种存储引擎MySQL提供了两种存储引擎:MyISAM和 InnoDB,MySQL4和5使用默认的MyISAM存储…

mysql 5.x 安装_mysql 5.5.x zip直接解压版安装方法
到官网下载mysql-5.5.10-win32.zip,然后将mysql解压到任意路径,如:C:\mysql-5.5.10-win32打开计算机->属性->高级系统设置->环境变量,新建一个环境变量,变量名为:MYSQL_HOME,变量值为你…

阿里云移动数据分析服务使用教程
阿里云大学课程:阿里云移动数据分析服务使用教程课程介绍:移动数据分析 (Mobile Analytics) 是阿里云推出的一款移动App数据统计分析产品,为开发者提供一站式数据化运营服务:通用的多维度用户行为分析、数据开放并支持自定义分析、…

Apache的服务端包含--SSI
SSI定义: SSI(服务器端包含)提供了一种对现有HTML文档增加动态内容的方法。 作用: 一般出于效率的考虑,网站都会把内容尽可能的静态化成HTML文件,但是网站页面的布局往往比较复杂,各个部分的更新…

mysql校对规则_MySQL中的校对规则
详解MySQL中的校对规则Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 7Server version: 5.6.14 MySQL Community Server (GPL)Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.Oracle is a registered…

c#操作oracle的通用类
using System;using System.Collections;using System.Collections.Generic;using System.Data;using System.Linq;using System.Text;using DDTek.Oracle;using System.Configuration;namespace Common{ <summary> /// OracleHelper 的摘要说明。 /// </summary> …

react es6+ 代码优化之路-1
这里集合了一些代码优化的小技巧 在初步接触 es6 和 react 的时候总结的一些让代码跟加简化和可读性更高的写法大部分知识点是自己在平时项目中还不知道总结的,一致的很多优化的点没有写出来,逐步增加中,目的是使用最少的代码,高效的解决问题…

反向ajax实现
英文原文: Reverse Ajax, Part 1: Introduction to Comet在过去的几年中,web开发已经发生了很大的变化。现如今,我们期望的是能够通过web快速、动态地访问应用。在这一新的文章系列中,我们学习如何使用反向Ajax(Revers…

ef关联多实体查询_Mybatis基本知识十二:关联关系查询之延迟加载:侵入式延迟加载...
上一篇文章:《Mybatis基本知识十一:关联关系查询之延迟加载策略:直接加载》若文中有纰漏,请多多指正!!!1.前言延续上一章节,本章节主要讲解和演示在关联关系查询中侵入式延迟加载是怎么回事。与…

Java高危漏洞被再度利用 可攻击最新版本服务器
2019独角兽企业重金招聘Python工程师标准>>> 安全研究人员警告称,甲骨文在2013年发布的一个关键 Java 漏洞更新是无效的,黑客可以轻松绕过。这使得此Java高危漏洞可以被再度利用,击运行最新版本 Java 的个人计算机及服务器。甲骨文…

不断演进的 Chrome 安全标识
文 / Chrome Security 产品经理 Emily Schechter 此前,我们曾发布一项提议,建议将所有 HTTP 网页标记为确定 “不安全” 并移除 HTTPS 网页的安全标识。自从我们在 Chrome 中引入安全标识以来,网络上的 HTTPS 使用量迅速增加。今年晚些时候&a…

gcc -E 选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面.例子用法:gcc -E hello.c > pianoapan.txtgcc -E hello.c | more慢慢看吧,一个hello word 也要与处理成800行的代码 -E选项,表示让gcc只进行“预处理”就行了。 所谓的预处理,就是…

剑指offer青蛙跳台阶问题
(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。//递归方式 public static int f(int n) { //参数合法性验证 if (n < 1) { System.out.println("参数必须大于1!&quo…

mysql 亿级表count_码云社 | 砺锋科技-MySQL的count(*)的优化,获取千万级数据表的总行数 - 用代码改变世界...
专注于Java领域优质技术号,欢迎关注作者:李长念一、前言这个问题是今天朋友提出来的,关于查询一个1200w的数据表的总行数,用count(*)的速度一直提不上去。找了很多优化方案,最后另辟蹊径,选择了用explain来…

使用mysql内连接查询年龄_Mysql的连表查询
若一个查询同时涉及到两个以上的表,称为连表查询准备表create table department(id int auto_increment PRIMARY KEY,name varchar(20));departmentcreate table employee(id int primary key auto_increment,name varchar(20),sex enum(male,female) not null defa…

FastDFS安装与使用
安装注意要修改:/etc/fdfs/client.confvim /etc/fdfs/client.confbase_path/home/yuqing/fastdfs 修改为: base_path/home/fastdfstracker_server192.168.209.121:22122 修改为: tracker_server10.201.20.237:22122##include http.conf 修改…

angular组合preact
preact 大小3kb,可以当做angular的一个dom库,而且可以对接使用preact生态系统,react组件修改成preact还是蛮简单的,这样就可以解决angular中用render2操作dom的繁琐问题了!O(∩_∩)O哈哈~,异想天开,动工! t…
大型网站系统架构系列:分布式消息队列(二)
四、JMS消息服务 讲消息队列就不得不提JMS 。JMS(JAVA Message Service,java消息服务)API是一个消息服务的标准/规范,允许应用程序组件基于JavaEE平台创建、发送、接收和读取消息。它使分布式通信耦合度更低,消息服务更加可靠以及…
Linux环境编译安装Mysql以及PHP中文乱码解决
mysql安装 5.6以后可能会收费,所以选择5.1以下从台湾中山大学镜像下载1.首先要安装C编译环境 # yum install gcc-c2.下载解压# wget http://mysql.cdpa.nsysu.edu.tw/Downloads/MySQL-5.1/mysql-5.1.73.tar.gz # tar zxvf mysql-5.1.73.tar.gz # cd mysql-5.1.7…

mysql noinstall_windows mysql noinstall
最近在想做mysql 主,从备份.在一台windows下安装多个mysql server , 发现用安装版的会覆盖前一安装程序,所以就用noinstall版本的mysql server,在此记录下安装过程的步骤.可主,从备份最终没能跑起来........这只是其中方法之一而已windows 下安装mysql-noinstall so easy!!!步骤…

[十九]JavaIO之PipedReader 和 PipedWriter
功能简介还记得PipedInputStream 和 PipedOutputStream么 我们之前是这么说的: 使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用 大致流程: 我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedO…
Linux环境HBase安装与使用
原文出自本人另一个Linux博客 http://blog.csdn.net/unix21/article/details/18776073 Linux环境:CentOS6.5 HBase版本:hbase-0.94.16 HBase官网:http://hbase.apache.org 1.下载解压安装文件 # wget http://mirror.bit.edu.cn/apache/hbase/…

Oracle定时执行存储过程
首先查看SQL> show parameter job NAME TYPE VALUE------------------------------------ ----------- ------------------------------job_queue_processes integer 10如果值是 0 需要修改(如果为…

mysql8.0取消授权_mysql8创建用户、删除用户、授权、取消授权
注意,以下命令均在数据库mysql中操作use mysql;mysql有密码设置规范,这里修改仅密码长度为4位,仅本次登录有效set global validate_password.policy0;set global validate_password.length4;创建用户格式CREATE USER usernamehost IDENTIFIED WITH mysql_native_pas…

Azure编配器简化有状态无服务器工作流的创建
Azure Durable Functions旨在通过引入编排器function概念来定义更复杂的工作流,以此来扩展无服务器计算范式。如果你曾经想过要使用它们,微软刚刚发布了一个示例,帮助开发人员开始他们的无服务器计算和编排器function之旅。\\Azure Functions…
ZooKeeper集群环境安装与配置
原文:出自本人的Linux博客http://blog.csdn.net/unix21/ ZooKeeper版本:3.4.5 约定:3台虚拟机 前提:需要安装JDK,关于Linux环境JDK安装配置参考我的另一帖Linux环境安装卸载JDK以及安装Tomcat和发布Java的web程序ZooKe…

thinkphp5 mysql长连接_tp5(thinkPHP5)框架连接数据库的方法示例
本文实例讲述了thinkPHP5框架连接数据库的方法。分享给大家供大家参考,具体如下:1、配置文件目录 tp5applicationdatabase.php通过配置文件来连接。。也可以通过方法链接在控制器里方法链接数据库 ;查询时写法 和使用系统的DB类方法略有差异/…