PHP OOP::在类之间传递会话密钥

PHP OOP::在类之间传递会话密钥,php,oop,class,sessionid,Php,Oop,Class,Sessionid,我正在努力找出最合适的设计,以便在PHP5.3中的类之间传递会话密钥 会话密钥是从第三方API检索的,我的应用程序进行各种API调用,这些调用都需要传入该会话密钥 我已经创建了一些类来保存相关的API调用,例如,类cart保存了一些方法,这些方法在被调用时会向API发出请求,以从API_GetCart()、API_AddItem()等调用返回数据 我将会话密钥存储在一个cookie(唯一需要的cookie)中,并且需要使该cookie的值对我的几乎所有类都可用。我无法使用数据库或$\会话来保存会

我正在努力找出最合适的设计,以便在PHP5.3中的类之间传递会话密钥

会话密钥是从第三方API检索的,我的应用程序进行各种API调用,这些调用都需要传入该会话密钥

我已经创建了一些类来保存相关的API调用,例如,类cart保存了一些方法,这些方法在被调用时会向API发出请求,以从API_GetCart()、API_AddItem()等调用返回数据

我将会话密钥存储在一个cookie(唯一需要的cookie)中,并且需要使该cookie的值对我的几乎所有类都可用。我无法使用数据库或$\会话来保存会话数据。第三方API负责诸如篮子内容等的会话管理

当用户第一次访问我的应用程序时,将没有cookie值,因此我需要能够将新会话密钥分配给新cookie,并将该值(由于我们仍在处理相同的HTTP请求,因此尚未作为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()