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

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

<?php
    class sample {
        function __call($a, $b) {
            echo ucwords(implode(' ', $b).' '.$a); //每个单词首字母大写
        }

        function ads() {
            ob_start();    //打开缓冲控制
            echo 'by';
            return $this;
        }

        function ade() {
            $c = ob_get_clean();
            $this->php('brophp', $c);
        }
    }

    $inst = new sample();

(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

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识, 语法, 题目

添加新评论