PHP面向对象一道题认识些函数
题目是酱紫的: 以下会输出啥?
1<?php
2 class sample {
3 function __call($a, $b) {
4 echo ucwords(implode(' ', $b).' '.$a); //每个单词首字母大写
5 }
6
7 function ads() {
8 ob_start(); //打开缓冲控制
9 echo 'by';
10 return $this;
11 }
12
13 function ade() {
14 $c = ob_get_clean();
15 $this->php('brophp', $c);
16 }
17 }
18
19 $inst = new sample();
20
(1)$inst->cmstop('welcome', 'to');
首先了解__call
的作用,关于这点,在PHP5魔术方法小结有提到,反正差不多就是这个意思,一共需要两个参数,第一个参数是functionName
,第二个是一个数组。
在此例中解释一下,就是调用两个不存在的方法$a
就是cmstop
,而$b
是welcome
和to
组成的数组,implode()
的作用是空格将数组元素变为字符串,也就是welcome to,而ucwords
每个单词首字母大写,所以输出Welcome To Cmstop
。
关于ucwords
扩展阅读:http://www.php.net/manual/zh/function.ucwords.php
(2)$inst->ads()->ade()
;
这真是一个绅士的题目,首先调用ads这个方法 打开缓冲控制之后在缓冲控制中的都是不输出的,而留在缓冲区,除非用ob_get_contents()
或者是ob_get_clean()
赋给变量。所以不会echo
,return
的$this
化为了$this->ade()
,开始ob_get_clean()
,也就是说$c
得到了by这个值,同时下一步调用了一个不存在的方法php,于是同上,输出就是Brophp By Php
关于缓冲区的扩展阅读:
http://www.php.net/manual/zh/function.ob-start.php
http://www.php.net/manual/zh/function.ob-get-clean.php
评论 (0)