CodeSky 代码之空

随手记录自己的学习过程

PHP面向对象一道题认识些函数

2014-02-01 22:34分类: PHP评论: 0

题目是酱紫的: 以下会输出啥?

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,而$bwelcometo组成的数组,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()赋给变量。所以不会echoreturn$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)