Heim  >  Artikel  >  Backend-Entwicklung  >  PHP中魔术方法的作用是什么?

PHP中魔术方法的作用是什么?

WBOY
WBOYOriginal
2016-06-06 20:11:221126Durchsuche

魔术方法也用的蛮多,最近在想一个问题,到底PHP为什么要加入魔术方法这个东西,是为了更好的支持面向对象还是?

请各位路过的不吝赐教,以解小弟的疑惑!

回复内容:

魔术方法也用的蛮多,最近在想一个问题,到底PHP为什么要加入魔术方法这个东西,是为了更好的支持面向对象还是?

请各位路过的不吝赐教,以解小弟的疑惑!

为什么加入魔术方法?为什么叫魔术方法,这其实不是主要问题
比如toString这个东西,java可以直接覆盖toString,js也可以定义toString,php为什么叫_toString?
构造方法,为什么python叫__init__,php叫__construct?
然后关于php的__construct,手册里写到

为了实现向后兼容性,如果 PHP 5 在类中找不到 __construct() 函数并且也没有从父类继承一个的话,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。因此唯一会产生兼容性问题的情况是:类中已有一个名为 __construct() 的方法却被用于其它用途时。

也就是说php和java一样之前也是支持同名函数做构造函数的,为什么之后该了,也就是你的迷惑,我的理解,一种命名习惯而已,你说按说法这些函数会在特殊场合被自动调用,叫做魔术方法理论上没错,但是java也有这些,为什么java没搞出这个名词?

但是说句实在的,php非得整出魔术方法这个名词来,而不像其他语言把他混合在其他定义里,比如js的toString就可以做一些题的考点,而且容易被忽略,php如果定义了魔术方法,那你复习的时候肯定要这些全看一次。。倒是方便考生和应聘者了

其实还是为了更好的支持面向对象,下面是一个例子。。。

<code><?php class Tools {
    
    /**
     * 利用魔术方法__call实现伪重载。。。
     * @return [type] [description]
     */
    public function __call($name, $args) {
        if ($name === "sum") {
            switch (count($args)) {
                case 2:
                    //求和:两个数
                    return $this->sum2($args[0], $args[1]);
                    break;
                case 3:
                    //求和:三个数
                    return $this->sum3($args[0], $args[1], $args[2]);
                    break;
            }
        }
    }

    /**
     * 利用魔术方法__callStatic实现伪重载。。。
     * @return [type] [description]
     */
    public static function __callStatic($name, $args) {
        if ($name === "area") {
            switch (count($args)) {
                case 1:
                    //计算圆的面积
                    return self::areaCircle($args[0]);
                    break;
                case 2:
                    //计算矩形的面积
                    return self::areaRectangle($args[0], $args[1]);
                    break;
            }
        }
    }

    /**
     * 计算圆的面积
     * @param  [type] $r [description]
     * @return [type]    [description]
     */
    public static function areaCircle($r) {
        return pi() * $r * $r;
    }

    /**
     * 计算矩形的面积
     * @param  [type] $length [description]
     * @param  [type] $width  [description]
     * @return [type]         [description]
     */
    public static function areaRectangle($length, $width) {
        return $length * $width;
    }

    /**
     * 求和:两个数
     * @param  [type] $num1 [description]
     * @param  [type] $num2 [description]
     * @return [type]       [description]
     */
    public function sum2($num1, $num2) {
        return $num1 + $num2;
    }

    /**
     * 求和:三个数
     * @param  [type] $length [description]
     * @param  [type] $width  [description]
     * @return [type]         [description]
     */
    public function sum3($num1, $num2, $num3) {
        return $num1 + $num2 + $num3;
    }
}

//测试开始

echo Tools::area(2) . "<br>";

echo Tools::area(2, 4) . "<br>";

$tools = new Tools();

echo $tools->sum(2, 3) . "<br>";
echo $tools->sum(2, 3, 4) . "<br>";</code>
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn