PHP OOP::在类之间传递会话密钥
我正在努力找出最合适的设计,以便在PHP5.3中的类之间传递会话密钥 会话密钥是从第三方API检索的,我的应用程序进行各种API调用,这些调用都需要传入该会话密钥 我已经创建了一些类来保存相关的API调用,例如,类cart保存了一些方法,这些方法在被调用时会向API发出请求,以从API_GetCart()、API_AddItem()等调用返回数据 我将会话密钥存储在一个cookie(唯一需要的cookie)中,并且需要使该cookie的值对我的几乎所有类都可用。我无法使用数据库或$\会话来保存会话数据。第三方API负责诸如篮子内容等的会话管理 当用户第一次访问我的应用程序时,将没有cookie值,因此我需要能够将新会话密钥分配给新cookie,并将该值(由于我们仍在处理相同的HTTP请求,因此尚未作为cookie提供)传递给其他类 我的一个想法是创建一个这样的会话类,并将会话捕获/检查代码放入构造函数中PHP OOP::在类之间传递会话密钥,php,oop,class,sessionid,Php,Oop,Class,Sessionid,我正在努力找出最合适的设计,以便在PHP5.3中的类之间传递会话密钥 会话密钥是从第三方API检索的,我的应用程序进行各种API调用,这些调用都需要传入该会话密钥 我已经创建了一些类来保存相关的API调用,例如,类cart保存了一些方法,这些方法在被调用时会向API发出请求,以从API_GetCart()、API_AddItem()等调用返回数据 我将会话密钥存储在一个cookie(唯一需要的cookie)中,并且需要使该cookie的值对我的几乎所有类都可用。我无法使用数据库或$\会话来保存会
class Session {
public $sk;
function __construct() {
//code to check if user has sessionkey (sk) in cookie
//if not, grab new sessionkey from 3rd party API and assign to new cookie
// $sk = 'abcde12345'; //example $sk value
}
}
然后在所有视图页面上,我将实例化一个新的会话实例,然后将该对象传递给每个需要它的类(几乎所有的类都是这样),作为类构造函数的参数或方法参数
orderSummary.php
创建一个会话类(实际上只包含一个值)是最好的主意吗?考虑到它可能需要保存更多的值和执行更多的检查,它觉得将其作为一个类是“正确的”。就将该值传递给各个类而言,最好将会话对象传递给它们的构造函数,例如
$se = new Session;
$basket = new Basket($se);
$baskSumm = $basket->getBasketSummary();
我是OOP新手,因此非常感谢您提供一些指导。您可以使用Factory模式。篮子、账单和交付对象应由第三方服务API包装类创建:
$svc = new The3rdPartyServiceApiWrapper();
$svc->init(); // connect, get session etc.
if ($svc->fail()) die("halp! error here!");
$basket = $svc->createBasket();
$baskSumm = $basket->getBasketSummary();
$billing = $svc->createBilling();
$billSumm = $billing->getBillingSummary();
$delivery = $svc->createDelivery();
$delSumm = $delivery->getDeliverySummary();
将Basket、Billing和Delivery类与API连接的最佳方法是存储对API类的引用,然后他们可以调用它的任何方法,而不仅仅是getSession()
另一个优点是,如果您有一个已识别的实体,例如用户,那么包装器类可以授予您在场景中不存在双重对象的权限
如果主程序创建了用户,那么同一用户应该有不同的对象,这是错误的:
$user1 = new User("fred12");
$user2 = new User("fred12");
VS如果API包装器创建了它们,包装器类应该保留用户的“缓存”,并为相同的请求返回相同的用户对象:
$user1 = $svc->createUser("fred12");
$user2 = $svc->createUser("fred12"); // $user2 will be the same object
(也许这不是一个最好的例子,如果一个程序创建了两个相同的用户,这意味着该程序的主要设计有缺陷。)
更新:svc等级说明
第三方服务APIwrapper应如下所示:
function getSessionId() {
return $this->sessionId; // initialized by constructor
} // getSessionId()
function createBasket() {
$basket = new Basket($this);
return $basket;
} // createBasket()
篮子:
function Basket($s) { // constructor of Basket class
$this->svc = $s;
//... the rest part of constructor
} // Basket() constructor
function doSomethingUseful() {
// if you wanna use the session:
$sess = $this->svc->getSessionId();
echo("doing useful with session $session");
// you may access other api functions, I don't know what functions they provide
$this->svc->closeSession();
} // doSomethingUseful()
谢谢你的回复。因此,我仍然会保留我的Basket对象及其所有方法,但只是通过包装类3rdpartyserviceapiwrapper对其进行实例化?这样做,我认为在Basket对象的getBasketSummary()方法中,我可以引用sessionkey,它是3rdPartyServiceApiWrapper类的成员变量,对吗?对于每个查看页面请求,将创建一个新的The3PartyServiceApiWrapper对象,其中包含“必须有”变量,如会话键,以及对创建的新对象(如篮、摘要等)的引用?请参阅更新。。。无论如何,必须为每个页面请求创建第三方服务APIwrapper,这就是PHP的工作方式。AFAIK没有办法像Java那样使用后台服务类。不过,这会很好。
function Basket($s) { // constructor of Basket class
$this->svc = $s;
//... the rest part of constructor
} // Basket() constructor
function doSomethingUseful() {
// if you wanna use the session:
$sess = $this->svc->getSessionId();
echo("doing useful with session $session");
// you may access other api functions, I don't know what functions they provide
$this->svc->closeSession();
} // doSomethingUseful()