为什么我不能重写父类?

时间:2010-04-08 04:46:27

标签: php oop magento

我想重写core / adminthtml / block / widget / tabs.php类,这是core / adminhtml / block / sales / order / view / tabs.php类的超类。

以下是两种情况的配置代码:

 <blocks>  
  <adminhtml>  
     <rewrite>
       <sales_order_view_tabs>Jimmy_SalesAffil_Block_Widget_Tabs</sales_order_view_tabs>  
       <widget_tabs>Jimmy_SalesAffil_Block_Widget_Tabs</widget_tabs>  
        .....
     </rewrite>  
  </adminhtml>  
 </blocks> 

虽然我能够重写...view/tabs.php,但我无法重写超类。为什么?可能吗?怎么样?

2 个答案:

答案 0 :(得分:3)

您可以重写父类,但这只适用于该类本身的调用。所以这个调用将检索正确覆盖的类:

Mage::getBlock("adminhtml/widget_tabs");

这是因为真正的类名是由Magento使用XML /覆盖系统加载的。但是,如果您不覆盖子类,则此调用将无法正常工作:

Mage::getBlock("admihtml/sales_order_view_tabs");

那是因为没有使用Magento系统指定父类,而是使用常规PHP:

class Mage_Adminhtml_Block_Sales_Order_View_Tabs extends Mage_Adminhtml_Block_Widget_Tabs

如果要覆盖父类,基于XML的覆盖系统无法帮助您。但是,您可以将Widget_Tabs类复制到本地空间,Magento会将其加载到那里。制作目录路径app/code/local/Mage/Adminhtml/Block/Widget/并将Tabs.php复制到其中,然后您可以根据需要进行修改。

希望有所帮助。

谢谢, 乔

答案 1 :(得分:2)

你是对的,你做不到,而且它与创建覆盖功能的方式有关。 PHP(不像说,ruby)为您提供了覆盖类的本机方式。 Magento通过(对于可覆盖的类)从不使用new关键字

来解决这个问题
new ClassName

创建一个类

相反,他们使用静态工厂方法

$object = Mage::getModel('/adminhtml/sales_order_view_tabs');

get model的作用是查看字符串/adminhtml/sales_order_view_tabs,然后将配置文件引用到查看它应该实例化的类

由于父类从未实例化,因此永远不能覆盖它们。