魔术方法学习笔记之动态类
大家等我教程等着急了吧?这几天事情比较多。
看到很多人看完上面的笔记还是有很多人不明白,不清楚,或者说有疑问的地发。不要着急,我今天绝对打消您的疑问。您瞧好吧。
今天我们利用前几天学习的知识,学习如何写一个动态类,其实是就是一个具有柔韧性的类。
什么是一个具有柔韧性的类?其实我也说不清楚,有的人更愿意称之为可以弯曲的类,因为这个类可以随你的意愿进行有特点的伸展。
我们上次提到了__set()这个魔术方法,又提到了,其实魔术方法之所以称之为魔术方法是由于我们不用主动去触发这个方法它就会自动的运行。
有的人会问了,在学习__set()的时候,我们是主动去调用它的啊。跟别的,比如__isset()方法有些不一样。其实在真正的运用中,__set()的使用方法不是上面那样的,请允许我为这篇文章埋下一个伏笔。今天我们就来学习__set()的最神奇的地方。
一个柔韧性的类的一个重要的特征应该就是属性具有柔韧度。如何制作一个具有伸缩属性的类?看下面的例子。
- <?php
- class Test {
- private $array; //PHP数组就是具有伸缩性的这个特性
- public function __set($key, $value) { //__set()魔术方法,设置$array的值。
- $this->array[$key] = $value;
- }
- public function get() {
- print_r($this->array);
- }
- }
- $test = new Test();
- $test->a = 'a'; //这样系统就会自动调用__set()这个魔术方法
- $test->b = 'b'; //这样下去,我们就可以设置无数个属性。
- $test->c = 'c'; //你还可以设置$test->d 。没有人拦着你,谁拦你我拦他!
- $test->get(); //输出 Array ( [a] => a [b] => b [c] => c )
- ?>
这只是个简单的例子,如果你要限制一些属性,该如何设置呢?还记得前面的课程吗?
PHP类中的魔术方法笔记之__call()等
昨天答辩实在曲折,到现在还没有开始,废话不说了,感觉继续奉上教程笔记。
今天我们要说的是__call() 和其他一些不常用的魔术方法,我也许只会点到一下,如果你想搞的非常透彻还需要自己下功夫。
__call() 是个非常重要的魔术方法,可以说非常非常的重要。至于为什么,相信你学习完今天的笔记就会明白了。
当我们实例化一个类的对象后,调用类中的一个方法,比如$test->fun();。系统就会从这个类中去找fun()这个方法,如果找到了就去执行它,如果没有找到就去调用 __call()。
我们来看下例子:
- <?php
- class Test {
- public function __call($fun, $args) { //第一次参数是方法名,第二个参数是传过来的参数,是以数组的方式传过来的。
- echo "你在调用".$fun."方法";
- print_r($args);
- }
- }
- $test = new Test();
- $test->fun("a","b"); //调用一个不存在的方法 参数是a和b .
- //输出 你在调用test方法Array ( [0] => a [1] => b )
- ?>
从上面的例子,我们可以清晰的分析出__call()方法的执行过程。但是我们想,如果类中存在一个同名的private方法,PHP会如何处理呢?我们来看下面的例子。
- <?php
- class Test {
- public function __call($fun, $args) {
- echo "你在调用".$fun."方法";
- print_r($args);
- }
- private function fun($a, $b) {
- echo "你再调用类中的private方法";
- }
- }
- $test = new Test();
- $test->fun("a","b"); //调用类中存在的private方法
- //输出 Fatal error: Call to private method Test::fun() from context '' in PHPDocument3 on line 14
- ?>
结果输出了错误,看来这种时候,魔术方法也不起作用。系统直接报错了。
现在我们再来想,如果调用本类中不存在的方法,而父类中存在的方法,是先调用本类的__call()呢还是先调用父类中存在的方法呢?我们继续来做实验。
PHP类中的魔术方法学习笔记之__set() __get() 等
即使你曾经对魔术方法没有任何接触,经过上节课的学习,那么我相信你也对魔术方法有一定的了解了。有了上节课的基础,我们的学习将会非常简单,因为魔术方法都是大同小异的东西。
今天我们要学习的是四个非常有用的魔术方法:__set() __get() __isset() __unset() ,特别是其中的 __set() 和 __get() ,在以后的面向对象的编程中经常会遇到,所以也是我们今天的重点。
我们还是从一个代码的例子出手。我们先来按照Java中类的思想写一个类。
- <?php
- class Test {
- //私有属性
- private $a;
- private $b;
- private $c;
- private $d;
- private $e;
- private $f;
- private $g;
- private $h;
- private $i;
- private $j;
- //还有很多很多....
- //Getters & Setters
- public function getA() {
- return $this->a;
- }
- public function getB() {
- return $this->b;
- }
- public function getC() {
- return $this->c;
- }
- public function getD() {
- return $this->d;
- }
- public function getE() {
- return $this->e;
- }
- public function getF() {
- return $this->f;
- }
- public function getG() {
- return $this->g;
- }
- public function getH() {
- return $this->h;
- }
- public function getI() {
- return $this->i;
- }
- public function getJ() {
- return $this->j;
- }
- public function setA($a) {
- $this->a = $a;
- }
- public function setB($b) {
- $this->b = $b;
- }
- public function setC($c) {
- $this->c = $c;
- }
- public function setD($d) {
- $this->d = $d;
- }
- public function setE($e) {
- $this->e = $e;
- }
- public function setF($f) {
- $this->f = $f;
- }
- public function setG($g) {
- $this->g = $g;
- }
- public function setH($h) {
- $this->h = $h;
- }
- public function setI($i) {
- $this->i = $i;
- }
- public function setJ($j) {
- $this->j = $j;
- }
- //还有很多很多...
- }
- ?>
请不要认为我这是在凑字数,因为你得相信我,我没有稿费,所以不用故意拖这么多字数。
在一般的面向对象的编程中,这种情况是相当常见的,我曾经用Struts2写过一个音乐分享的网站,单单一个注册,因为注册要获取的字段很多,类似PHP的$_POST,Struts2的机制就是给每个Form元素都设定一个Getter和Setter,这样下来,单单一个注册的类就有多的数不清的Getters和Setters。这是个非常艰巨的任务,程序员是写程序的,不是抄程序的,所以强大的Eclipse就为我们提供了一个简单的方法,只要你设定了类的属性,你就可以通过鼠标点击来生成相应的Getter和Setter,所以你不要认为上面的代码是我傻乎乎写的,我是个懒人,十分会偷懒的:)
扯远了,PHP为了解决这个问题,而且又有魔术方法的基础,所以PHP创造了 __set() 和 __get() 。你只需要写一个方法,就可以代表上面大部分的Getters和Setters。
PHP类中的魔术方法学习笔记之__sleep()与__wakeup()
PHP不知道为什么,钟爱“魔术”这个词,什么都弄魔术。其实想想也非常形象,就拿PHP类中的魔术方法来说吧,你不需要去调用他们的任何一个方法,他们却可以执行,影响你的程序。
首先学习PHP4中就有的魔术方法——__sleep()和__wakeup()。
其实这两个方法用的非常非常的少,少到在我接触PHP1年半的前提下,如果不去主动学习他们根本不知道他们的存在,但是本着对学术严谨的态度,多学点没什么坏处,用不了多少时间,所以你也可以跟着我花几分钟的时间熟悉一下这两个方法。
我刚才说他们用的非常非常的少,我用了两个非常,大家可以想想一下他们的程度。不光我们要知道他们用的少,重要的是知道为什么用的少。我先写一段代码,你看看你是否见到过或者曾经写过,我见识比较少,至少我之前是没有见过这么写的。
- <?php
- class Test {
- public $testStr;
- public function fun() {
- //搞点小事情
- }
- }
- $test = new Test();
- echo serialize($test); //输出 O:4:"Test":1:{s:7:"testStr";N;}
- ?>
它竟然把一个类的给序列化了,也就是把一个类转换成了一个字符串,可以传输或者保存下来。我以前可没有接触过这么神奇的事情。
下面我修改一下上面的代码,上面不是要搞点小事情吗?那我现在就搞给你看!
分类目录
- ActionScript (2)
- CSS (25)
- Java (3)
- JavaScript (41)
- PHP (108)
- 心情杂谈 (34)
- 收集整理 (77)
- 本站原创 (57)
最近文章
- 在sae中利用SaeFetchurl进行豆瓣的OAuth授权
- OAuth 1.0a与1.0协议的改进…
- 深入理解OAuth与豆瓣OAuth test
- include_path+__autoload与数组+__autoload的比较
- 将google ssl设置为IE8的默认搜索引擎..
- 我们来做一个会呼吸的菜单吧!!
- 在编译php-fpm0.6的时候需要注意的一些问题
- 使用PHP将大文件导入到数据库中..
- 关于用PHP调用WebService中参数为complexType的问题
- 神奇的两次按位非运算符
- 百路推免费短网址服务..首创”收藏夹获取短网址”..
- 哥学社正式上线..
- jQuery中getJSON跨域原理详解
- Web辅助工具条(原名:河蟹工具条CrabBar)0.1发布
- 腾讯微博PC端发图教程
近期评论
- 老飞的小窝 在 jQuery中getJSON跨域原理详解 上的评论
- Jackie.Hamos 在 将google ssl设置为IE8的默认搜索引擎.. 上的评论
- Elmer Zhang 在 在sae中利用SaeFetchurl进行豆瓣的OAuth授权 上的评论
- 茶叶蛋 在 一个PHP+AJAX留言板的完整例子.非常简单! 上的评论
- 9527 在 我们为什么要抛弃模板引擎?? 上的评论
- hikurasai 在 Flash TagCloud中文版. 上的评论
- lx 在 PHP上传进度条深度解析 上的评论
- lx 在 使用PHP将大文件导入到数据库中.. 上的评论
- nflauthentic 在 哥学社正式上线.. 上的评论
- uggsale 在 有三个主题的CSS导航菜单 上的评论
文章归档
- 2010 年八月 (4)
- 2010 年七月 (3)
- 2010 年六月 (4)
- 2010 年五月 (2)
- 2010 年四月 (9)
- 2010 年三月 (12)
- 2010 年二月 (1)
- 2010 年一月 (3)
- 2009 年十二月 (2)
- 2009 年十一月 (3)
- 2009 年十月 (3)
- 2009 年九月 (5)
- 2009 年八月 (4)
- 2009 年七月 (6)
- 2009 年六月 (8)
- 2009 年五月 (8)
- 2009 年四月 (16)
- 2009 年三月 (19)
- 2009 年二月 (22)
- 2009 年一月 (20)
- 2008 年十二月 (38)
- 2008 年十一月 (22)
- 2008 年十月 (7)
- 2008 年九月 (3)
- 2008 年八月 (24)

Jessica
