- 像 catalog/product 这样的class名字定义方式
- 找出完整的class名字
- 预设置好的 include 路径以及这几个include路径的先后顺序
- __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的范围,便是要找的文件了。