我对我看到的电话有点困惑Mage::getSingleton,我希望有人可以帮我理解一点.
我看过一段核心代码可以做到这一点:
Mage::getSingleton('customer/session')->isLoggedIn()
Run Code Online (Sandbox Code Playgroud)
我不知道PHP,但我认为我可以在一个安全的假设getSingleton方法名,将有只有一个指定的类(类被指定为分组类名,并决心对实例app/code/core/Mage/Customer/Model/Session.php-含类Mage_Customer_Model_Session.
问题1 -
如何知道getSingleton方法在类的Model文件夹中查找?
问题2 -
所以整个类有一个实例...我想说JVM因为我来自Java背景,但我会说PHP引擎希望这是一个模糊的正确术语; 在Mage_Customer_Model_Session没有在客户ID或任何此类标识符过去了,但我们所说的方法isLoggedIn()!Mage_Customer_Model_Session假设每个客户没有实例,当我们没有告诉客户我们正在谈论的客户时,我们如何询问客户是否登录?
问题3 -
我已经看到了通话Mage::getSingleton('core/session')和Mage::getSingleton('customer/session')-的区别是什么?
感谢您的任何帮助.
Ala*_*orm 99
首先,在我们访问Magento之前,了解PHP与Java相比具有完全不同的流程模型非常重要.PHP单例(不管Magento的参与)是每个HTTP请求的一个类的单个实例.PHP程序在内存中的持久性与Java程序的持久性不同,因此相应地调整对"单例"的期望.
接下来,重要的是要理解Magento是一个基于 PHP 构建的框架,使用PHP,并且在许多情况下,原始的Magento开发人员希望将事物推向更像Java的体系结构.所以,你会看到看起来熟悉,熟悉的东西,但可能与你习惯的东西有所不同,因为他们仍然需要知道PHP的宇宙版本.
Magento使用工厂模式来实例化Helpers,Blocks和"Model"类.字符串
core/session
Run Code Online (Sandbox Code Playgroud)
是一个别名.此别名用于在Magento的配置中查找类名.简而言之,此字符串将转换为路径表达式,用于搜索Magento的配置文件,以根据调用它的上下文(帮助程序,块,模型)派生类名.对于较长的版本,请参阅我的Magento的类实例化自动加载文章.
Magento中"模型"的概念有点模糊.在某些情况下,模型用作域或服务模型.在其他情况下,它们被用作更传统的中间件数据库持久性模型.在使用该系统几年后,我认为最安全的思考模型的方法是Magento试图取消直接类实例化.
有两种实例化模型类的方法.
Mage::getModel('groupname/classname');
Mage::getSingleton('groupname/classname');
Run Code Online (Sandbox Code Playgroud)
第一个表单将为您提供一个新的类实例.第二种形式将为您提供单例类实例.这个特殊的Magento抽象允许您从任何 Magento模型类中创建单例,但前提是您坚持使用Magento的实例化方法.也就是说,如果你打电话
Mage::getSingleton('groupname/classname');
Run Code Online (Sandbox Code Playgroud)
然后随后打电话给
Mage::getSingleton('groupname/classname');
Run Code Online (Sandbox Code Playgroud)
将返回该单例实例.(这是使用注册表模式实现的).但是,没有什么可以阻止您直接实例化该类的新实例
$o = Mage::getModel('groupname/classname');
$o = new Mage_Groupname_Model_Classname();
Run Code Online (Sandbox Code Playgroud)
这让我们参加了会议.PHP的请求模型,如HTTP,最初设计为无状态.每个请求都带有来自用户的信息进入系统.随着语言(和Web)逐渐成为一个应用程序平台,引入了一个允许信息持久化的系统来取代正在出现的本土系统.这个系统叫做会话.PHP会话通过向最终用户程序员公开超级全局$ _SESSION数组来工作,该数组允许以每个Web用户为基础存储信息.通过在用户端将唯一ID设置为cookie,然后将该cookie用作查找键(也是Web应用程序的标准做法)来实现会话
反过来,Magento系统在PHP的会话抽象之上构建抽象.在Magento中,您可以创建一个"会话模型",该会话模型继承自基本会话类,在其上设置数据成员,并像使用数据库持久性模型一样保存/加载这些数据成员.不同之处在于信息存储在会话中而不是数据库存储中.当你看到
core/session
customer/session
Run Code Online (Sandbox Code Playgroud)
这是两种不同的会话模型,每种模型都存储不同的数据.一个属于Mage_Core模块,另一个属于Mage_Customer模型.该系统允许模块安全地设置和操作自己的会话数据,而不会意外地踩到另一个模块的脚趾,并提供操作该数据的逻辑类方法.
希望能回答你提出的问题以及你没有问过的问题.
vsu*_*kov 11
Magento的getSingleton与getModel几乎相同.区别在于getModel总是返回一个类的新实例,而getSingleton只创建一个类的新实例,然后始终返回此实例.请参阅Mage::getSingleton和Mage::getModel方法.由于config.xml文件(fe Mage/Customer/etc/config.xml)中的配置,Magento知道要查看Model文件夹.请参阅Magento wiki,以便开发人员了解有关配置文件的更多信息.
您没有直接指定客户.它由Magento在父类中自动完成Mage_Customer_Model_Session(参见Mage_Core_Model_Session_Abstract_Varien::start()方法)
Magento没有一个会话类来区分会话数据.例如,客户ID存储在其中Mage_Customer_Model_Session,错误消息"产品不可用"将存储在Mage_Catalog_Model_Session类中.
| 归档时间: |
|
| 查看次数: |
24752 次 |
| 最近记录: |