- 浏览: 204682 次
文章分类
- 全部博客 (224)
- jsp (5)
- jsf (7)
- web (11)
- js (12)
- COBOL (5)
- php (7)
- jconsole (1)
- java (11)
- ajax (1)
- PHP魔法方法 (1)
- 项目管理工具 (3)
- 项目管理 (2)
- svn (8)
- redmine (1)
- mysql (4)
- qrcode,php (1)
- qrcode (1)
- 多进程 (3)
- html (1)
- excel (2)
- seasar2 (1)
- db (1)
- entity (1)
- IOS8 (1)
- SWIFT (1)
- 正则表达式 (1)
- RabbitVCS (1)
- url (1)
- thinkphp (2)
- c++ (5)
- win32 API函数 (1)
- htaccess (1)
- makefile (3)
- C/C++ (12)
- Linux (1)
- miui (2)
- unix (1)
- wechat (1)
- websocket (1)
- SpringMVC (3)
- VSAM (1)
- centos (2)
- wamp (1)
- server (1)
- 优酷视频上传并去除广告 (1)
- owncload (1)
- cloud (1)
- ubuntu (1)
- pdf转换成word (1)
- 微信,weixin (1)
- 行业系统 (3)
- 超级外卖源代码 (0)
- 软件专利 (1)
- 申请 (1)
- vba (1)
- UML (1)
- 程序切片 (1)
- 股票心得 (1)
- 威客建站 (1)
- 微信开发学习路线 (1)
- 远程开机 (1)
- spring mvc (1)
- JEECMS (1)
- Node.js (1)
- ThinkJS (1)
- maven (2)
- MyEclipse+Tomcat+MAVEN+SVN (1)
- Spring+SpringMVC+MyBatis (1)
- wampserver (0)
- RESTful (1)
- hibernate (4)
- Spring+SpringMVC (1)
- 响应式布局 (1)
- 响应式布局模板 (1)
- Aptana (3)
- 遗传算法 (1)
- 进化算法 (1)
- bower (1)
- HTML5 (1)
- Android官方培训课程 (1)
- MySQL锁 (1)
- 扫描枪 (1)
- 微信公众平台 (1)
- 企业号 (1)
- ddns (1)
- java获取外网ip (1)
- DDNS,阿里云,云解析,万网域名,阿里云域名 (1)
- SEO (1)
- Jboss (2)
- wildfly (1)
- WildFly8 (2)
- NT Kernel (1)
- 反向代理 (1)
- Spring嵌套事务 (1)
- apache (3)
- 防止浏览器记住用户名及密码的简单实用方法 (1)
- 时间戳 (1)
- 字体 (1)
- 网络爬虫准 (1)
- 屏蔽后退按钮 (1)
- java web (1)
- JavaMail (1)
- windows服务 (1)
- Freemarker (1)
- TortoiseGit (2)
- oschina (1)
- JSON (1)
- Boost (1)
- MUI (1)
- github (1)
- Python2.7 (1)
- Python3.0 (1)
- Odoo (1)
- java socket (1)
- OpenERP (2)
- werkzeug (1)
- JNA (2)
- proxifier (1)
- WebService (1)
- 企业应用集成 (1)
- vmware (1)
- Navicate (1)
- 三体 (1)
- oracle同步 (1)
- 微信 (3)
- java设计模式 (1)
- 工具 (1)
- JavaScript跨域 (1)
- LB (1)
- 负载均衡 (1)
- AngularJS (1)
- HBuilder (1)
- Echarts (1)
- Json Web Token (1)
- PassportSDK (1)
- ubuntu kylin xterm 乱码 (1)
- ubuntu kylin17 安装字体教程 (1)
- wps (1)
- jetbrains (1)
- MySQL5.7 (1)
- Nginx (1)
- JDK (1)
最新评论
-
cuiyadll:
谢谢楼上的推荐
实战:jQuery Mobile开发HTML5移动应用 -
marty:
使用JQueryMobile,推薦使用這免費開發工具,提供可視 ...
实战:jQuery Mobile开发HTML5移动应用 -
men_clslji:
按照目前的方法只是防止刷新页面时不再执行X(添加),而toke ...
有了上一篇博文,类似地顺便说说表单防重复提交。
引自:
http://blog.csdn.net/inqihoo/article/details/9235103
在php的语法中,有一些系统自带的方法名,均以双下划线开头,它会在特定的情况下被调用。即所谓的魔法函数。
只有当你已经为一个给定类定义了这些魔法方法时,它们才会起作用。还要注意,这些方法不能直接调用,而只能通过要截获的事件来调用。
它们在面向对向编程中起着至关重要的作用。所以个人觉得很有必要整理一下。下面就php的15个魔法函数做一个详细整理:
1. __construct() 和 __destruct()
__construct() 对象初始化时会调用此方法(对于内核而言是指初始化完成后调用此方法).此方法用得比较多。__destruct() 当对象销毁时会调用此方法.那么什么时候对象会销毁呢?一是用户主动销毁对象,二是当程序结束时由引擎自动销毁
[php] view plaincopy
2. __get() 和 __set()
面向对象编程中使用频率很高的两个方法.当设置和获取对象的属性不允许访问时性,此方法会被调用。一定注意是不存在或不允许被读写时才会被调用。
因此对于一个对象,其属性不确定时,用这两个方法效果很好。
__get($name) 获取对象不存在的属性或无法访问的属性时调用.$name表示要获取的属性名
__set($name, $value) 设置对象不存在的属性或无法访问的属性时调用.$name表示要设置的属性名,$value表示要设置的值.
3. __isset() 和 __unset()
这两个方法用得比较少些。当调用方法isset()判断对象是否存在某属性, 调用unset()注销某属性时。且当这些属性不存在或不可访问时,会分别调用__isset()和__unset()方法
与前面的__get()和__set()略同。都是某属性不存在或不可访问时被调用
__isset($name) 当调用方法isset()方法判断不可访问的类属性时调用.$name表示属性名.
__unset($name) 当调用方法unset()方法删除不可访问的类属性时调用.$name表示属性名.
4. __call() 和 __callStatic()
前面,我们发现,在获取对象的属性时,如果此属性不存在会调用__get()方法。那么如果调用此对象的方法时,如果此方法不存在呢?php引擎会自动调用__call()方法。
同样,如果调用的是静态方法,且不存在时会调用__callStatic()方法。需要注意的是,__callStatic()使用时是一个静态方法,且仅在php5.3以上版本才支持.
__call($method, $args) 调用对象方法不存在或不允许被调用时此方法会被调用。$method表示调用的方法名,$args表示调用的参数
__callStatic($method, $args) 调用对象的静态方法不存在或不允许被调用时此方法会被调用。$method表示调用的方法名,$args表示调用的参数.
[php] view plaincopy
5. __sleep() 和 __wakeup()
这两个方法,咋一看,就是睡觉和唤醒嘛。那跟对象有什么关系?有时候该用的时候也想不起来。其实,我们简单点记,在php中有一个让对象睡觉的方法,叫searialize(),
它会将对象的各属性序列化以方便保存起来。而unsearialize()方法是将保存的序列化的数据解开变成对象。也叫唤醒。相对应的,当睡觉时,php会调用__sleep()方法,它
的返回值必须是一个数组,表示需要保存的属性项, 对于文件句柄,数据库连接等资源类型的数据是不能被序列化保存的。同理唤醒对象时,php会调用__wakeup()方法,
但与__sleep()不同的是,它返回值为空。被保存的属性都会被解开。那它有什么用呢?刚我们说了,searialize是不能保存资源的。那么唤醒时如果我们想用到这些资源怎么
办?回答很肯定,重新创建?那在哪里创建合适呢?当然是__wakeup()方法里面,因为每次唤醒时都会调用此方法嘛。这下我们很清楚这两个方法的用途了。
__sleep() 当调用searialize()方法时调用,返回值为数组,表示需要序列化的数据项.
__wakeup() 当调用unsearizlie()方法时调用。一般用来在唤醒时初始化资源对象.
[php] view plaincopy
6. __toString()
当对象在需要转换成字符串时,会调用此方法。例如,echo对象时,将对象强制转换为string类型时, 用于字符串参数的函数中.注意:此方法的返回值必须为字符串。
[php] view plaincopy
7. __clone()
此方法在复制对象时被调用。我们知道在php中.$a为一个对象,$b=$a时。$b为$a的引用。当$a发生改变时。$b也会随之发生变化。那么为了使$b不发生变化,我们需要用$b=clone $a;
那么,当$a在调用clone的时候,引擎会自动调用__clone()方法
[php] view plaincopy
8. __autoload()
autoload顾名思义就是自动加载。它主要用来自动加载类。那如何自动加载呢?我们都知道在php中,要使用另外一个文件中的类需要用require或include方法
(包括require_once和include_one)导入进来。那么如果我要使用的类未被导入,则引擎会自动调用__autoload()方法。利用此特性,当我们的类名和类文件有规律
地存放时,我们可以使用__autoload()方法,根据需导入的类名,让程序自动导入文件。此函数在许多的MVC框架中起着重要的作用。
__autoload($name) $name表示需要自动导入的类名
[php] view plaincopy
9. __set_state()
这个方法用得不多。了解这个方法前,需要先知道var_export()函数,var_export()和var_dump()类似,输出一个变量的字符串表示。他与var_dump的区别在于它的返回结果的是合法的
php代码.此代码可以被eval执行. 注意:此方法是一个静态方法,且在php5.1以上版本才支持。
[php] view plaincopy
10. __invoke()
这个方法我刚开始接触的时候,一眼望去,真看不出来它到底干嘛的。主要是不明白invoke是啥意思。后来查了字典才明白。意思是呼叫。英语差伤不起呀。
在php中这个方法用于,把对象当方法用的时候。此方法会被调用。很简单。注意,此方法仅5.3以上版本支持。
[php] view plaincopy
http://blog.csdn.net/inqihoo/article/details/9235103
在php的语法中,有一些系统自带的方法名,均以双下划线开头,它会在特定的情况下被调用。即所谓的魔法函数。
只有当你已经为一个给定类定义了这些魔法方法时,它们才会起作用。还要注意,这些方法不能直接调用,而只能通过要截获的事件来调用。
它们在面向对向编程中起着至关重要的作用。所以个人觉得很有必要整理一下。下面就php的15个魔法函数做一个详细整理:
1. __construct() 和 __destruct()
__construct() 对象初始化时会调用此方法(对于内核而言是指初始化完成后调用此方法).此方法用得比较多。__destruct() 当对象销毁时会调用此方法.那么什么时候对象会销毁呢?一是用户主动销毁对象,二是当程序结束时由引擎自动销毁
[php] view plaincopy
class People { protected $_alive; public function __construct() { $this->_alive = true; echo 'Birth'.PHP_EOL; } public function __destruct() { $this->_alive = false; echo 'Die'.PHP_EOL; } } //主动销毁对象 $test = new Test(); unset($test); sleep(1); //程序完成后自动销毁对象 $test = new Test(); sleep(1);
2. __get() 和 __set()
面向对象编程中使用频率很高的两个方法.当设置和获取对象的属性不允许访问时性,此方法会被调用。一定注意是不存在或不允许被读写时才会被调用。
因此对于一个对象,其属性不确定时,用这两个方法效果很好。
__get($name) 获取对象不存在的属性或无法访问的属性时调用.$name表示要获取的属性名
__set($name, $value) 设置对象不存在的属性或无法访问的属性时调用.$name表示要设置的属性名,$value表示要设置的值.
//例如:我们可以构建一个不确定属性的数据记录类 class Record { protected $_data; public function __get($name) { if (isset($this->_data[$name])) { return $this->_data; } return false; } public function __set($name, $value) { $this->_data = $value; } } $record = new Record(); $record->name = 'andrew'; echo 'My name is '.$record->name.PHP_EOL;
3. __isset() 和 __unset()
这两个方法用得比较少些。当调用方法isset()判断对象是否存在某属性, 调用unset()注销某属性时。且当这些属性不存在或不可访问时,会分别调用__isset()和__unset()方法
与前面的__get()和__set()略同。都是某属性不存在或不可访问时被调用
__isset($name) 当调用方法isset()方法判断不可访问的类属性时调用.$name表示属性名.
__unset($name) 当调用方法unset()方法删除不可访问的类属性时调用.$name表示属性名.
//例如: class People { public $name; public $sex; private $_age; public function __construct($name, $sex, $age) { $this->name = $name; $this->sex = $sex; $this->_age = $age; } public function __isset($name) { echo 'The property '.$name.' not exists'.PHP_EOL; } public function __unset($name) { echo 'The property '.$name.' can not be unset'.PHP_EOL; } } $people = new People('andrew', 'male', 28); isset($people->name); isset($people->real_name); unset($people->_age);
4. __call() 和 __callStatic()
前面,我们发现,在获取对象的属性时,如果此属性不存在会调用__get()方法。那么如果调用此对象的方法时,如果此方法不存在呢?php引擎会自动调用__call()方法。
同样,如果调用的是静态方法,且不存在时会调用__callStatic()方法。需要注意的是,__callStatic()使用时是一个静态方法,且仅在php5.3以上版本才支持.
__call($method, $args) 调用对象方法不存在或不允许被调用时此方法会被调用。$method表示调用的方法名,$args表示调用的参数
__callStatic($method, $args) 调用对象的静态方法不存在或不允许被调用时此方法会被调用。$method表示调用的方法名,$args表示调用的参数.
[php] view plaincopy
//例如:我们假定人只有跳走两种行为 class People { public function jump() { echo 'I can jump'.PHP_EOL; } public function walk() { echo 'I can walk'.PHP_EOL; } public function __call($method, $args) { echo 'I can not '.$method.PHP_EOL; } //此方法必须是静态方法,且在php5.3版本下可用 public static function __callStatic($method, $args) { echo 'We can not'.$method.PHP_EOL; } } $people = new People(); $people->jump(); $people->walk(); $people->fly(); People::fly();
5. __sleep() 和 __wakeup()
这两个方法,咋一看,就是睡觉和唤醒嘛。那跟对象有什么关系?有时候该用的时候也想不起来。其实,我们简单点记,在php中有一个让对象睡觉的方法,叫searialize(),
它会将对象的各属性序列化以方便保存起来。而unsearialize()方法是将保存的序列化的数据解开变成对象。也叫唤醒。相对应的,当睡觉时,php会调用__sleep()方法,它
的返回值必须是一个数组,表示需要保存的属性项, 对于文件句柄,数据库连接等资源类型的数据是不能被序列化保存的。同理唤醒对象时,php会调用__wakeup()方法,
但与__sleep()不同的是,它返回值为空。被保存的属性都会被解开。那它有什么用呢?刚我们说了,searialize是不能保存资源的。那么唤醒时如果我们想用到这些资源怎么
办?回答很肯定,重新创建?那在哪里创建合适呢?当然是__wakeup()方法里面,因为每次唤醒时都会调用此方法嘛。这下我们很清楚这两个方法的用途了。
__sleep() 当调用searialize()方法时调用,返回值为数组,表示需要序列化的数据项.
__wakeup() 当调用unsearizlie()方法时调用。一般用来在唤醒时初始化资源对象.
[php] view plaincopy
//例如我们有一个用户类,用户名和性别都是类属性。用户的密码存在文件中 Class User { public $username; public $sex; public $passFile; private $_password; public function __construct($username, $sex, $passFile) { $this->username = $username; $this->sex = $sex; $this->passFile = $passFile; $this->_password = file_get_contents($passFile); } public function getPassword() { return $this->_password; } public function __sleep() { return array( 'username', 'sex', 'passFile', ); } public function __wakeup() { $this->_password = file_get_contents($this->passFile); } } $user = new User('andrew', 'male', 'pass.data'); $serializeData = serialize($user); echo $serializeData.PHP_EOL; $user = unserialize($serializeData); echo $user->getPassword().PHP_EOL;
6. __toString()
当对象在需要转换成字符串时,会调用此方法。例如,echo对象时,将对象强制转换为string类型时, 用于字符串参数的函数中.注意:此方法的返回值必须为字符串。
[php] view plaincopy
//例如: class Info { public function __toString() { return "info"; } } $info = new Info(); echo $info.PHP_EOL; echo md5($info).PHP_EOL; echo (String) $info.PHP_EOL; echo substr($info, 0, 2).PHP_EOL;
7. __clone()
此方法在复制对象时被调用。我们知道在php中.$a为一个对象,$b=$a时。$b为$a的引用。当$a发生改变时。$b也会随之发生变化。那么为了使$b不发生变化,我们需要用$b=clone $a;
那么,当$a在调用clone的时候,引擎会自动调用__clone()方法
[php] view plaincopy
//例如:以下一个简单的例子 class Data { public $value; public function __clone() { echo "Clone myself".PHP_EOL; } } $data = new Data(); $data->value = 4; $newData = clone $data; $data->value = 5; echo "The data value is: ".$data->value.PHP_EOL; echo "The new data value is: ".$newData->value.PHP_EOL; //对面向对象比较熟的同学,一定对单例模式不陌生。PHP做单例模式的时候要记住把clone方法给禁掉。因为在单例模式中,是不允许复制对象的。如下例 class OnlyOne { //单例对象 private static $_instance; //不允许外部和子类调用初始化方法 private function __construct() {} //不允许复制 public function __clone() { throw new Exception('Not allow to clone me'); } //获取单例对象 public static function getInstance() { if (self::$_instance != null) { return self::$_instance; } self::$_instance = new self(); return self::$_instance; } } $onlyOne = OnlyOne::getInstance(); $newOne = clone $onlyOne;
8. __autoload()
autoload顾名思义就是自动加载。它主要用来自动加载类。那如何自动加载呢?我们都知道在php中,要使用另外一个文件中的类需要用require或include方法
(包括require_once和include_one)导入进来。那么如果我要使用的类未被导入,则引擎会自动调用__autoload()方法。利用此特性,当我们的类名和类文件有规律
地存放时,我们可以使用__autoload()方法,根据需导入的类名,让程序自动导入文件。此函数在许多的MVC框架中起着重要的作用。
__autoload($name) $name表示需要自动导入的类名
[php] view plaincopy
//我们制订规则类名以目录名加下载线拼接而成。例如:类Model_Config_Xml表示Model/Config/Normal.php文件.我们如何实现自动加载 //有类文件Model/Config/Normal.php内包含类如下: class Model_Config_Normal { public function __construct() { echo "Init Model_Config_Normal".PHP_EOL; } } function __autoload($name) { $classPath = str_replace('_', DIRECTORY_SEPARATOR, $name); require_once("$classPath.php"); } //此时将无需再require('Model/Config/Normal.php') $config = new Model_Config_Normal();
9. __set_state()
这个方法用得不多。了解这个方法前,需要先知道var_export()函数,var_export()和var_dump()类似,输出一个变量的字符串表示。他与var_dump的区别在于它的返回结果的是合法的
php代码.此代码可以被eval执行. 注意:此方法是一个静态方法,且在php5.1以上版本才支持。
[php] view plaincopy
//例如: class Test { public $name; public $age; public static function __set_state($data) { $obj = new Test(); $obj->name = $data['name']; $obj->age = $data['age'] + 1; return $obj; } } $test = new Test(); $test->name = 'andrew'; $test->age = 27; $code =var_export($test, true); echo $code.PHP_EOL; eval('$new='.$code.';'); var_dump($new);
10. __invoke()
这个方法我刚开始接触的时候,一眼望去,真看不出来它到底干嘛的。主要是不明白invoke是啥意思。后来查了字典才明白。意思是呼叫。英语差伤不起呀。
在php中这个方法用于,把对象当方法用的时候。此方法会被调用。很简单。注意,此方法仅5.3以上版本支持。
[php] view plaincopy
class Invoke { public function __invoke() { echo 'I can run'.PHP_EOL; } } $invoke = new Invoke(); $invoke();
发表评论
-
PHP操作Excel – PHPExcel 基本用法详解
2015-06-15 10:30 686导出excel属性设置//Include classrequi ... -
php 等于不等于 一个感叹号两个等于号
2014-10-03 17:23 1281$a == $b 等于 TRUE,如果 $a 等于 $b。 $ ... -
php setcookie函数失效
2014-09-25 18:05 1976最近在为一个网站写php后台的时候发现setcookie这个 ... -
php生成二维码实现代码
2014-05-20 17:31 1458引用[导读] 二维码是二维条形码的一种,可以将网址、文字、照片 ... -
PHP开发调试环境配置文档
2014-01-03 00:18 632PHP开发调试环境配置文档 -
wampserver和eclipsePhp一起使用开发php (PHP新手可以看)
2014-01-02 22:37 1516wampserver和eclipsePhp开发php 刚开始学 ...
相关推荐
**PHP远程唤醒技术详解** PHP远程唤醒,也称为网络唤醒(Wake-on-LAN,简称WOL),是一种通过网络启动远程计算机的技术。这项技术允许你通过发送一个特定的“魔法包”(Magic Packet)到目标设备的网络接口来唤醒...
【PHP编程语言思维导图详解】 PHP(Hypertext Preprocessor,超文本预处理器)是一种广泛应用于Web开发的开源脚本语言,尤其擅长于服务器端的编程。它嵌入到HTML中,使得开发者能够轻松地在网页中添加动态内容。这...
- 魔法方法:如`__construct()`, `__destruct()`, `__get()`, `__set()`, `__call()`, `__toString()`等。 7. **数据库操作** - PDO或MySQLi接口:用于连接和查询MySQL数据库,掌握SQL语句的基本用法。 - 数据库...
#### 魔法方法 PHP5提供了若干预定义的特殊方法,如`__call()`, `__get()`, `__set()`, `__isset()`, `__unset()`等,帮助处理类的异常情况或实现特定功能。 #### 静态成员 静态成员属于类本身,而不是类的实例,...
第一种方法是使用PHP的魔法函数`__call`。`__call`方法在尝试调用一个不可访问或不存在的方法时被触发。利用这个特性,我们可以拦截对不存在方法的调用,并动态地执行操作。结合`call_user_func`函数,可以实现对...
### PHP优化技巧详解 在开发基于PHP的应用程序时,优化是一项至关重要的工作,它能够显著提升应用程序的性能和用户体验。本文将围绕“php的资料php优化”这一主题展开,详细介绍一系列有效的PHP优化策略。 #### 1....
这种方法的核心是利用PHP的魔法函数`__call`,当尝试调用类中不存在的方法时,`__call`会被自动触发。在`__call`中,我们可以捕获到这个未定义的方法名以及传入的参数,然后使用`call_user_func`动态调用相应函数并...
【PHP的严重缺陷详解】 PHP,作为一种广泛使用的服务器端脚本语言,虽然有着广泛的社区支持和丰富的库资源,但在实际应用中,它确实存在一些显著的不足之处,这些缺陷可能影响到开发效率、代码质量和系统稳定性。...
- 魔法方法:如__get(), __set()用于处理未定义的属性访问。 11. **模板引擎** - PHP本身即可作为简单的模板引擎,将逻辑代码与视图分离。 - 同时存在多种成熟的PHP模板引擎,如Smarty、Twig等,提供更高级的...
php中数据的魔法引用函数 magic_quotes_gpc 或 magic_quotes_runtime 设置为on时,为我们引用的数据碰到 单引号’ 和 双引号” 以及 反斜线\ 时自动加上反斜线,帮我们自动转译符号,确保数据操作的正确运行两者...
- **魔法方法**:以双下划线开头的方法,如`__call`和`__autoload`。 ##### 2.3 常量和配置 - **常量命名**:全部使用大写字母和下划线,如`APP_PATH`。 - **配置参数命名**:使用小写字母和下划线,如`url_route_...
7.0核心源码分析详解》 Discuz!作为一款知名的社区论坛软件,其核心源码的解析对于理解其运行机制至关重要。本文将深入探讨Discuz!7.0的核心代码,特别是include目录下的核心文件,尤其是common.inc.php和global....
**PHP面向对象编程(OOP)详解** 在编程领域,面向对象编程(Object-Oriented Programming,简称OOP)是一种广泛采用的编程范式,它将数据和操作数据的方法封装在一起,形成对象。PHP,作为一种动态类型语言,自从...
- 魔法方法以双下划线开头,如 `__call` 和 `__autoload`。 **3.1.3 函数命名** - 函数名使用小写字母加下划线命名。 **3.1.4 常量命名** - 常量名使用大写字母加下划线命名。 **3.1.5 配置命名** - 配置参数使用...
7. **魔法方法**:以双下划线`__`开头的为魔法方法,如`__call`、`__autoload`。 8. **常量命名**:常量全大写,用下划线分隔,如`HAS_ONE`、`MANY_TO_MANY`。 9. **配置参数**:配置参数同样全大写,下划线分隔,...
- 魔法方法:如`__construct()`,`__destruct()`,`__get()`,`__set()`等。 - 访问修饰符:`public`,`private`,`protected`。 9. **MySQL数据库交互** - 使用`mysqli`或`PDO`扩展连接MySQL数据库。 - SQL...