当前位置: 首页 > 工具软件 > mage > 使用案例 >

Magento源码分析笔录二:Mage.php主要枢纽类

束俊英
2023-12-01
该文件为magento官方叫 ’Main Mage hub class’,翻译为中文叫’主要枢纽类’。重要性不言而喻。它是入口文件与系统其它服务交互的必经之地。


我们一行行分析代码。
首先定义了系统的DS、PS、BP。定义DS、PS是为了兼容WINDOW 和LINUX系统对目录分隔符和路径分隔符的不同表示方法。BP定义了系统的绝对路径。
接着获得inlcude_path,如果有编译开启了则把编译的路径配置set到系统的include_path,接着包含编译的核心函数及类自动加载机制。如果没有开启编译,同样也是path的管理,
把app/code/目录下的local,community,core及lib下的包、库set到系统的include_path。关于include_path,它是PHP include require文件时寻找文件时的路径定义。
如果包含的同一个文件在多个include_path中,则会按照include_path的顺序有相应的加载机制。
接着引入 include_once "Mage/Core/functions.php";include_once "Varien/Autoload.php";


Functions.php
处理了gpc.Class autoload,对象析构,翻译函数,ucwords,Simple sql format date,编译文件的寻找机制,自定义的错误处理,自定义的回溯跟踪函数的调用信息,csv解析,目录是否可写,
系统临时文件 sys_get_temp_dir 如果没有自己创建一个。


Autoload.php
类自定加载机制,magento有编译的概念,编译也是一个大的课题,magento用了做优化用的,后续会专门介绍。类的自动记载机制就要区分magento是否处于编译运行状态,如果是则从编译后的文件里去寻找文件。如果不是,则启动默认的类自动加载。
类的自动加载,PHP 里可以参考 spl_autoload_register(),__autoload();


接着就是final Mage类。
该类是入口文件与系统其它服务交互的必经之地。里面的属性及方法全为静态的,而且该类不允许被继承。
该类是系统入口文件进入到系统的入口点。入口文件通过Mage::run($mageRunCode, $mageRunType);进入到该类。


到达之后:
1.启动Varien_Profiler::start('mage'); 主要是用了计算程序性能检测,程序块执行的花费的时间及占用的内存等。
2.设置$_appRoot路径即app的绝对路径
3.初始化self::$_app = new Mage_Core_Model_App();
4.self::$_app setRequest,setResponse
5.初始化 self::$_events = new Varien_Event_Collection();事件集合
6.根据参数设置程序已经安装,设置_setConfigModel 如果没有则初始化self::$_config = new Mage_Core_Model_Config($options);
7.应用开始启动
self::$_app->run(array(
'scope_code' => $code,
'scope_type' => $type,
'options' => $options,
));


在magento里理解app是一个大的概念,官方定义为:Application should have: areas, store, locale, translator, design package。
后续会专门说说Mage_Core_Model_App


final Mage该类是入口文件与系统其它服务交互的必经之地,它主要做了什么


第一:一些静态属性的定义
如 属性 $_registry = array() 翻译中文为注册表,登记处。它是全局的变量集合,可以在一次请求中把需要的变量,数组,集合,对象等数据类型注册进去,在需要用的时候再取出来
该集合里的值可以注册、取出、销毁。通过register(),registry(),unregister()。在系统里及第三方的模块你会发现会频繁用到。
$_appRoot:/app 目录绝对地址
$_app:Mage_Core_Model_App 对象
$_config:Mage_Core_Model_Config 对象
$_events:Varien_Event_Collection事件集合
$_objects:Varien_Object_Cache 缓存对象
$_isDeveloperMode:是否为开发模式
...


第二:静态方法
getVersion()获得版本信息
getBaseDir()
getModuleDir()
getStoreConfig()
getStoreConfigFlag()
getBaseUrl()
getUrl()
getDesign()Get design package singleton
dispatchEvent()事件派发
getModel()获得某模块的model
getResourceModel()
helper()
app() Get initialized application object. 这个很重要,在不用index.php,自己在根目录写一个功能需要用到magento的时候有用
log()
...


从上面的属性及方法可以看出,该类为系统全局性的东西做出了定义,及对一些获得特定的服务定义了一些方法。
最重要的它是系统入口文件进入到系统的入口点。及app()方法的应用日后会举个demo给大家看,非常有用。


此文核心点:
1.兼容系统常量的定义
2.编译文件的引入
3.类自动加载机制
4.入口点的执行流程
5.对该类提供的全局属性及方法有一个全局上的认识


转载请注明:
Author: muzihao2014
http://www.lookdrupal.com/node/847
 类似资料: