php :可笑的重载

在OOP语言中,重载是定义一个和已有方法同名的方法,当然,返回值,或者参数类型会发生改变。

但是,在PHP中,重载完全不是这种概念。PHP 中的重载是创建一个没有定义的方法或者属性。

  • PHP中重载属性非常容易理解,本质上就是内部创建一个数值,然后提供 __set()/__get()方法,来增减私有数值的元素。以此达到”重载属性”的目的。
    • 从OOP语言角度而言,这是一种很常见的做法,但是在OOP中这种做法不叫重载。将有这种功能的类成为POJO或者JavaBean
  • PHP中重载函数相对于重载属性有点难理解,但也是可以理解的。重载函数本质上是对PHP中可变函数的一种使用。在OOP语言中,没有所谓的可变函数的说法,也没有类似的功能。然而,可变函数的使用,一定会导致代码的可读性变差。那么,PHP中,重载函数到底是什么呢?其实,就是在类的内容定义一个可变函数__call($func,$arg),然后,在使用该类的实例的时候,就可以使用该可变函数定义好的函数,也就是所谓的”重载函数“
    • 在JS,Python等类似的语言中,也有这种可变函数,甚至在C语言中,也有这种功能。但是在OOP语言,比如Java中就不存在类似的功能。有时候写Java的时候,也希望有这种功能的存在,但是,无论如何,这种可变函数,确实降低了代码的可读性~

来看一个重载属性的例子:

class Car {
    private $ary = array();

    public function __set($key, $val) {
        $this->ary[$key] = $val;
    }

    public function __get($key) {
        if (isset($this->ary[$key])) {
            return $this->ary[$key];
        }
        return null;
    }

    public function __isset($key) {
        if (isset($this->ary[$key])) {
            return true;
        }
        return false;
    }

    public function __unset($key) {
        unset($this->ary[$key]);
    }
}
$car = new Car();
$car->name = '汽车';  //name属性动态创建并赋值
echo $car->name;

和一个重载函数的例子:

class Car {
    public $speed = 0;

    public function __call($name, $args) {
        if ($name == 'speedUp') {
            $this->speed += 10;
        }
    }
}
$car = new Car();
$car->speedUp(); //调用不存在的方法会使用重载
echo $car->speed;

从这个重载函数的例子可以看出,这种对于函数的重载并没有什么实际的意义。毕竟,在实际需求中,往往不需要重载一个叫speedUp 的函数。如果,我们在自己的类中重载一个其他的函数,比如叫say,但是意义也并不明显。通过这种容易产生歧义的方式去定义函数,必然大大降低代码的可读性。实际开发中,还不如直接定义一个叫say的方法来得时在。

另外,例子代码来自幕客网

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值