Is it a good idea to use overloading for solely cute-function-naming reasons? 🙂
不,我的意思是,这取决于. :)让我们为编程生活添加一些可怕和可爱:
$ordinary = new stdClass();
$ordinary->Caption = 'Hello';
class Awesome
{
private $ordinary;
public function __construct($ordinary) {
$this->ordinary = (array) $ordinary;
}
public function __get($name) {
$value = '';
return $this->ordinary[$name];
}
}
class Lovely extends Awesome
{
public function __get($name)
{
return '<3 ' . parent::__get($name) . ' <3';
}
}
我必须承认,这个例子可能有点超过顶部,但显示了一些东西.
首先,假设API是一个类.所以它从一个非常普通的stdClass开始.
这个例子显示的是那些魔术函数可用于重载或装饰某些东西.可以,但绝不能.看到令人敬畏的API,它本身就很棒:
$awesome = new Awesome($ordinary);
echo $awesome->Caption, "\n"; # This caption is just awesome by itself!
# Hello
然后看看更可爱的API示例:
$lovely = new Lovely($ordinary);
echo $lovely->Caption, "\n"; # This caption is lovely, hughs and kisses everyone!
# <3 Hello <3
所以在这个例子中,对于Lovely来说这是一个好主意,但它对Awesome来说没用,因为Awesome实际上更容易获得:
$awesome = $ordinary;
这让我想到了,API中的重载只能在特定点上有用.作为Lovely节目,它可以用来装饰另一个(没有多少指定的对象),但它也表明这只是一次性的:可爱已经需要知道如何调用Awesome来利用它的功能(现在不再是魔术)__ get方法:
public function __get($name)
{
return '<3 ' . parent::__get($name) . ' <3';
}
当您现在认为Awesome是您的API时,您可以看到它阻止自己轻易地从想要使用它的其他代码中重载.
因此,在具体的代码中,重载可以很好,API不应该阻止它.但是当API本身过载时,事情变得很困难.
不仅仅是编码,添加动态/魔术也使得调试变得困难.因此,最好保持您创建的API,并提供更具体的界面,然后只需[]或 – >.你可以给出具体的名称,并且效果很好;)
然后它更加可爱:
echo $store->getObject('product')->getPrice($currency);