Browsing all articles tagged with 魔术方法
15
7

魔术方法学习笔记之动态类

Author Jessica     Category PHP, 本站原创     Tags , ,

大家等我教程等着急了吧?这几天事情比较多。

看到很多人看完上面的笔记还是有很多人不明白,不清楚,或者说有疑问的地发。不要着急,我今天绝对打消您的疑问。您瞧好吧。

今天我们利用前几天学习的知识,学习如何写一个动态类,其实是就是一个具有柔韧性的类。

什么是一个具有柔韧性的类?其实我也说不清楚,有的人更愿意称之为可以弯曲的类,因为这个类可以随你的意愿进行有特点的伸展。

我们上次提到了__set()这个魔术方法,又提到了,其实魔术方法之所以称之为魔术方法是由于我们不用主动去触发这个方法它就会自动的运行。

有的人会问了,在学习__set()的时候,我们是主动去调用它的啊。跟别的,比如__isset()方法有些不一样。其实在真正的运用中,__set()的使用方法不是上面那样的,请允许我为这篇文章埋下一个伏笔。今天我们就来学习__set()的最神奇的地方。

一个柔韧性的类的一个重要的特征应该就是属性具有柔韧度。如何制作一个具有伸缩属性的类?看下面的例子。

  1. <?php  
  2. class Test {  
  3.     private $array;  //PHP数组就是具有伸缩性的这个特性  
  4.  
  5.     public function __set($key$value) {  //__set()魔术方法,设置$array的值。  
  6.         $this->array[$key] = $value;  
  7.     }  
  8.  
  9.     public function get() {  
  10.         print_r($this->array);  
  11.     }  
  12. }  
  13. $test = new Test();  
  14. $test->a = 'a';  //这样系统就会自动调用__set()这个魔术方法  
  15. $test->b = 'b';  //这样下去,我们就可以设置无数个属性。  
  16. $test->c = 'c';  //你还可以设置$test->d 。没有人拦着你,谁拦你我拦他!  
  17. $test->get();  //输出  Array ( [a] => a [b] => b [c] => c )  
  18. ?> 

这只是个简单的例子,如果你要限制一些属性,该如何设置呢?还记得前面的课程吗?

read more

9
2

PHP类中的魔术方法笔记之__call()等

Author Jessica     Category PHP, 本站原创     Tags , ,

昨天答辩实在曲折,到现在还没有开始,废话不说了,感觉继续奉上教程笔记。

今天我们要说的是__call() 和其他一些不常用的魔术方法,我也许只会点到一下,如果你想搞的非常透彻还需要自己下功夫。

__call() 是个非常重要的魔术方法,可以说非常非常的重要。至于为什么,相信你学习完今天的笔记就会明白了。

当我们实例化一个类的对象后,调用类中的一个方法,比如$test->fun();。系统就会从这个类中去找fun()这个方法,如果找到了就去执行它,如果没有找到就去调用 __call()。
我们来看下例子:

  1. <?php  
  2. class Test {  
  3.  
  4.     public function __call($fun$args) {  //第一次参数是方法名,第二个参数是传过来的参数,是以数组的方式传过来的。  
  5.         echo "你在调用".$fun."方法";  
  6.         print_r($args);  
  7.     }  
  8. }  
  9. $test = new Test();  
  10. $test->fun("a","b");  //调用一个不存在的方法 参数是a和b .  
  11. //输出  你在调用test方法Array ( [0] => a [1] => b )  
  12. ?> 

从上面的例子,我们可以清晰的分析出__call()方法的执行过程。但是我们想,如果类中存在一个同名的private方法,PHP会如何处理呢?我们来看下面的例子。

  1. <?php  
  2. class Test {  
  3.  
  4.     public function __call($fun$args) {  
  5.         echo "你在调用".$fun."方法";  
  6.         print_r($args);  
  7.     }  
  8.  
  9.     private function fun($a$b) {  
  10.         echo "你再调用类中的private方法";  
  11.     }  
  12. }  
  13. $test = new Test();  
  14. $test->fun("a","b");  //调用类中存在的private方法  
  15. //输出  Fatal error: Call to private method Test::fun() from context '' in PHPDocument3 on line 14  
  16. ?> 

结果输出了错误,看来这种时候,魔术方法也不起作用。系统直接报错了。

现在我们再来想,如果调用本类中不存在的方法,而父类中存在的方法,是先调用本类的__call()呢还是先调用父类中存在的方法呢?我们继续来做实验。

read more

7
2

PHP类中的魔术方法学习笔记之__set() __get() 等

Author Jessica     Category PHP, 本站原创     Tags , ,

即使你曾经对魔术方法没有任何接触,经过上节课的学习,那么我相信你也对魔术方法有一定的了解了。有了上节课的基础,我们的学习将会非常简单,因为魔术方法都是大同小异的东西。

今天我们要学习的是四个非常有用的魔术方法:__set() __get() __isset() __unset() ,特别是其中的 __set() 和 __get() ,在以后的面向对象的编程中经常会遇到,所以也是我们今天的重点。

我们还是从一个代码的例子出手。我们先来按照Java中类的思想写一个类。

  1. <?php  
  2. class Test {  
  3.  
  4.     //私有属性  
  5.  
  6.     private $a;  
  7.     private $b;  
  8.     private $c;  
  9.     private $d;  
  10.     private $e;  
  11.     private $f;  
  12.     private $g;  
  13.     private $h;  
  14.     private $i;  
  15.     private $j;  
  16.     //还有很多很多....  
  17.  
  18.     //Getters & Setters  
  19.  
  20.     public function getA() {  
  21.         return $this->a;  
  22.     }  
  23.  
  24.     public function getB() {  
  25.         return $this->b;  
  26.     }  
  27.  
  28.     public function getC() {  
  29.         return $this->c;  
  30.     }  
  31.  
  32.     public function getD() {  
  33.         return $this->d;  
  34.     }  
  35.  
  36.     public function getE() {  
  37.         return $this->e;  
  38.     }  
  39.  
  40.     public function getF() {  
  41.         return $this->f;  
  42.     }  
  43.  
  44.     public function getG() {  
  45.         return $this->g;  
  46.     }  
  47.  
  48.     public function getH() {  
  49.         return $this->h;  
  50.     }  
  51.  
  52.     public function getI() {  
  53.         return $this->i;  
  54.     }  
  55.  
  56.     public function getJ() {  
  57.         return $this->j;  
  58.     }  
  59.  
  60.     public function setA($a) {  
  61.         $this->a = $a;  
  62.     }  
  63.  
  64.     public function setB($b) {  
  65.         $this->b = $b;  
  66.     }  
  67.  
  68.     public function setC($c) {  
  69.         $this->c = $c;  
  70.     }  
  71.  
  72.     public function setD($d) {  
  73.         $this->d = $d;  
  74.     }  
  75.  
  76.     public function setE($e) {  
  77.         $this->e = $e;  
  78.     }  
  79.  
  80.     public function setF($f) {  
  81.         $this->f = $f;  
  82.     }  
  83.  
  84.     public function setG($g) {  
  85.         $this->g = $g;  
  86.     }  
  87.  
  88.     public function setH($h) {  
  89.         $this->h = $h;  
  90.     }  
  91.  
  92.     public function setI($i) {  
  93.         $this->i = $i;  
  94.     }  
  95.  
  96.     public function setJ($j) {  
  97.         $this->j = $j;  
  98.     }  
  99.     //还有很多很多...  
  100. }  
  101. ?> 

请不要认为我这是在凑字数,因为你得相信我,我没有稿费,所以不用故意拖这么多字数。

在一般的面向对象的编程中,这种情况是相当常见的,我曾经用Struts2写过一个音乐分享的网站,单单一个注册,因为注册要获取的字段很多,类似PHP的$_POST,Struts2的机制就是给每个Form元素都设定一个Getter和Setter,这样下来,单单一个注册的类就有多的数不清的Getters和Setters。这是个非常艰巨的任务,程序员是写程序的,不是抄程序的,所以强大的Eclipse就为我们提供了一个简单的方法,只要你设定了类的属性,你就可以通过鼠标点击来生成相应的Getter和Setter,所以你不要认为上面的代码是我傻乎乎写的,我是个懒人,十分会偷懒的:)

扯远了,PHP为了解决这个问题,而且又有魔术方法的基础,所以PHP创造了 __set() 和 __get() 。你只需要写一个方法,就可以代表上面大部分的Getters和Setters。

read more

6
1

PHP类中的魔术方法学习笔记之__sleep()与__wakeup()

Author Jessica     Category PHP, 本站原创     Tags , ,

PHP不知道为什么,钟爱“魔术”这个词,什么都弄魔术。其实想想也非常形象,就拿PHP类中的魔术方法来说吧,你不需要去调用他们的任何一个方法,他们却可以执行,影响你的程序。

首先学习PHP4中就有的魔术方法——__sleep()和__wakeup()。

其实这两个方法用的非常非常的少,少到在我接触PHP1年半的前提下,如果不去主动学习他们根本不知道他们的存在,但是本着对学术严谨的态度,多学点没什么坏处,用不了多少时间,所以你也可以跟着我花几分钟的时间熟悉一下这两个方法。

我刚才说他们用的非常非常的少,我用了两个非常,大家可以想想一下他们的程度。不光我们要知道他们用的少,重要的是知道为什么用的少。我先写一段代码,你看看你是否见到过或者曾经写过,我见识比较少,至少我之前是没有见过这么写的。

  1. <?php  
  2. class Test {  
  3.     public $testStr;  
  4.     public function fun() {  
  5.         //搞点小事情  
  6.     }  
  7. }  
  8. $test = new Test();  
  9. echo serialize($test);  //输出  O:4:"Test":1:{s:7:"testStr";N;}  
  10. ?> 

它竟然把一个类的给序列化了,也就是把一个类转换成了一个字符串,可以传输或者保存下来。我以前可没有接触过这么神奇的事情。

下面我修改一下上面的代码,上面不是要搞点小事情吗?那我现在就搞给你看!

read more

分类目录

最近文章

近期评论

文章归档

标签

.net AJAX button Comet CSS Discuz! DIV+CSS Flash Form Google HTML编辑器 IE8 Java JavaScript jQuery JSP md5 MySQLReback OAuth Oracle PHP php-fpm PNG Punny SkiyoTabs tab TagCloud Vista Web2.0 Windows7 上传 加密 图标 本站原创 模板 模板引擎 源码 登录 短网址 石家庄 算法 编译 面向对象 魔术方法

链接表