• CMS
    内容发布型网站
  • 结构清晰 易于发布
    功能强大 容易扩展
  • B2C
    购物型网站
  • 安全,优化,功能齐全
    及完善的后台管理
  • 客户定制
    系统开发
  • 用我们精湛的技术
    打造属于你的系统
  • 完善的
    解决方案
  • 业务背后是强大的
    开源社区, 你事业无忧
  • 后续
    技术支持
  • 稳定的后续技术支持
    为你的业务保驾护航

magento 类实例化的方式,工厂设计模式 GoF

浏览位置

  1. 像 catalog/product 这样的class名字定义方式
  2. 找出完整的class名字
  3. 预设置好的 include 路径以及这几个include路径的先后顺序
  4. __autoload(),自动加载的方式

 

像 catalog/product 这样的class名字定义方式

在magento里面,实例化一个model, 通常不会直接用 new class()这样的方式来做,像要拿 一个product的model,Magento的方式是:

Mage::getModel('catalog/product'); 这样的方式在magento的代码里面随处可见,在这个方法中,Mage::getModel()包含了一个类型信息,就是model, Magento称它为 group type。当然还有其它 的 group type,如: Mage::getResourceModel('catalog/product')类型是resourceModel,Mage::helper('catalog/category_flat')类型是helper,Mage::app()->getLayout()->createBlock('catalog/product')类型是block。

实例化时的输入参数'catalog/product'包含了两部分的信息:斜杠前面和后面两部分。前面部分的catalog是一个字符串,Magento称它为一个group(组),通过它可以找到对应的一个类名的前辍(catalog是一个特定的字符串,主要看你在那个module的config.xml文件里写的是什么)。斜杠后面的product,斜杠后面不管出现什么字符,都是类名的后半部分。这样,把类名的前辍和后面的部分连接起来就能确定一个class的名字,然后根据这个class的名字在运行时自动加载就能实例化该 class.

 

找出完整的class名字

'catalog/product'  根据 catalog 这个字符串,可以找到类名的前辍为:Mage_Catalog_Model ;再和后面的product连接起来就是:Mage_Catalog_Model_Product ,这样一个完整类名就完全确定了。

为什么根据 catalog 这个字符串能找到类名前辍 Mage_Catalog_Model ?这里要看Catalog 模块的配置文件 config.xml:

< config >

    < global > 

             < models > 注意这里是一个复数,有个s

                       < catalog > 这就是类名的 group(组) 了,catalog这个字符就写在这儿

                             < class >Mage_Catalog_Model< /class >  类名前辍在这里定义了 

 。。。

Mage::getConfig()->getGroupedClassName('model', 'catalog/product'); 这句的意思是返回一个 group_type为 model, 输入参数为 catalog/product 的完整类名。

Magento的类名最终都会通过getGroupedClassName()这个方法来实现,它属于核心类 core/config ,全部的逻辑都在这个方法里面,只要认真查看,便能看得十分清楚。

 

在 config.xml 文件中,

1,  要配置类型是 model 的类,它的路径应该是这样的:

config / global / models / catalog(类组的定义字符串) / class / Mage_Catalog_Model ( 类名前辍)

2,  要配置类型是 helper 的类,它的路径应该是这样的:

config / global / helpers / catalog(类组的定义字符串) / class / Mage_Catalog_Helper ( 类名前辍)

3,  要配置类型是 block 的类,它的路径应该是这样的:

config / global / blocks / catalog(类组的定义字符串) / class / Mage_Catalog_Block ( 类名前辍)

所以,当用这句代码  Mage::getModel('catalog/layer_state')  去实例化时,它返回的类就是(前辍 + 后面的字符): Mage_Catalog_Model_Layer_State

 

预设置好的 include 路径以及这几个include路径的先后顺序

在 Magento 程序开始跑起来之前,有几个默认的路径其实已经被纳入了 include 的范围之中,它们就是:


    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'local';

    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'community';

    $paths[] = BP . DS . 'app' . DS . 'code' . DS . 'core';

    $paths[] = BP . DS . 'lib';

分别有: local ;community ;core ;lib 

这4个路径按照它们的先后顺序被预先设为 include path, 程序在自动加载类文件的时候会先后在这4个文件夹里面寻找相应的文件。这段代码在 Mage.php 这个文件的开头处便写好了。从这个顺序也可以看出,在 local 文件夹里面的文件会被最优先使用,这也是为什么建议用户自己的代码最好放在 local 下面的原因。

 

__autoload(),自动加载的方式

当类名确定之后,在运行中要实例化类就必须要找到和这个类对应的php文件。如这个类: Mage_Catalog_Model_Layer_State ,自动加载的方式十分 简单,就是把下划线换成斜杠 / , 最后在后面加上 【.php】:  Mage_Catalog_Model_Layer_State 则变成: Mage/Catalog/Model/Layer/State.php ,看到了吗?到最后这个类名转身一变成了一个文字的全路径名称,再把这个路径接上预先 include的范围,便是要找的文件了。

信息反馈 / 咨询
名字   *
Email*
验证码   *
内容*