PHP中魔术方法的作用是什么?
巴扎黑
巴扎黑 2017-04-10 17:17:04
0
2
615

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

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

巴扎黑
巴扎黑

全部回覆(2)
巴扎黑

为什么加入魔术方法?为什么叫魔术方法,这其实不是主要问题
比如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如果定义了魔术方法,那你复习的时候肯定要这些全看一次。。倒是方便考生和应聘者了

伊谢尔伦

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

<?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/>";
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!