1<?php
2//
3// +----------------------------------------------------------------------+
4// | PEAR :: Cache                                                        |
5// +----------------------------------------------------------------------+
6// | Copyright (c) 1997-2003 The PHP Group                                |
7// +----------------------------------------------------------------------+
8// | This source file is subject to version 2.02 of the PHP license,      |
9// | that is bundled with this package in the file LICENSE, and is        |
10// | available at through the world-wide-web at                           |
11// | http://www.php.net/license/2_02.txt.                                 |
12// | If you did not receive a copy of the PHP license and are unable to   |
13// | obtain it through the world-wide-web, please send a note to          |
14// | license@php.net so we can mail you a copy immediately.               |
15// +----------------------------------------------------------------------+
16// | Authors: Richard Heyes <richard@phpguru.org>                         |
17// +----------------------------------------------------------------------+
18//
19// $Id: Application.php 178289 2005-01-26 09:47:28Z dufuz $
20
21require_once 'Cache.php';
22
23// Application level variables
24//
25// Purpose
26// Variables that are persisent across all user sessions,
27// not just a specific user ala normal sessions.
28//
29// Usage:
30//
31// Example 1:
32//
33// $app  =& new Cache_Application();
34// $_APP =& $app->getData();
35//
36// In this case the $_APP variable is akin to the $_SESSION variable.
37// If you add/remove stuff, it will be reflected in the next request
38// (of any user).
39//
40// Example 2:
41//
42// $foo = 'Some data';
43// $bar = 'Some other data';
44//
45// $app =& new Cache_Application();
46// $app->register('foo');
47// $app->register('bar', $bar);
48//
49// $foo = 'Different data';
50//
51// In this case the variables are registered with the register() function.
52// This is akin to session_register().
53//
54// As with session_register(), the contents of the variable at the *end* of the
55// request is registered and not at the point of registration. Therefore in this
56// example, for the $foo variable, the string 'Different data' is stored and not
57// 'Some data'. The exception to this rule is if you use the second argument to
58// register() as in the second call to it above. This will cause the data supplied
59// in the second argument to be stored and not the contents at the end of the request.
60//
61// Note: If you use this method with register_globals turned on, the variables will be
62//       automatically globalled upon startup, (ie. when you create the object).
63//
64// Note: If you register a variable that is not set when the script finishes, it will
65//       registered as null.
66//
67//
68// *** You are strongly recommended to use only one method of the two above. ***
69//
70// (In fact if you use the register() function with register_globals Off, you have to
71//  use the $_APP method to get at the data).
72
73class Cache_Application extends Cache
74{
75
76    var $data;
77    var $id;
78    var $group;
79    var $registered_vars;
80
81    /**
82    * Constructor
83    *
84    * @param    string  Name of container class
85    * @param    array   Array with container class options
86    */
87    function Cache_Application($container = 'file', $container_options = array('cache_dir' => '/tmp/', 'filename_prefix' => 'cache_'), $id = 'application_var', $group = 'application_cache')
88    {
89        $this->id    = $id;
90        $this->group = $group;
91        $this->registered_vars = array();
92
93        $this->Cache($container, $container_options);
94        $this->data = $this->isCached($this->id, $this->group) ? unserialize($this->get($this->id, $this->group)) : array();
95
96        // If register_globals on, global all registered variables
97        if (ini_get('register_globals') && is_array($this->data)) {
98            foreach ($this->data as $key => $value) {
99                global $$key;
100                $$key = $value;
101            }
102        }
103    }
104
105    /**
106    * Destructor
107    *
108    * Gets values of all registered variables and stores them. Then calls save() to
109    * write data away.
110    */
111    function _Cache_Application()
112    {
113        // Get contents of all registered variables
114        if (is_array($this->registered_vars) && !empty($this->registered_vars)) {
115            foreach ($this->registered_vars as $varname) {
116                global $$varname;
117                $this->data[$varname] = $$varname;
118            }
119        }
120
121        // Save the data
122        $this->save($this->id, serialize($this->data), 0, $this->group);
123    }
124
125    /**
126    * register()
127    *
128    * Registers a variable to be stored.
129    *
130    * @param    string  Name of variable to register
131    * @param    mixed   Optional data to store
132    */
133    function register($varname, $data = null)
134    {
135        if (isset($data)) {
136            $this->data[$varname] = $data;
137        } else {
138            $this->registered_vars[] = $varname;
139        }
140    }
141
142    /**
143    * unregister()
144    *
145    * Unregisters a variable from being stored.
146    *
147    * @param    string  Name of variable to unregister
148    */
149    function unregister($varname)
150    {
151        if (isset($this->data[$varname])) {
152            unset($this->data[$varname]);
153        }
154    }
155
156    /**
157    * clear()
158    *
159    * Removes all stored data
160    */
161    function clear()
162    {
163        $this->data = array();
164    }
165
166    /**
167    * getData()
168    *
169    * Use this to get a reference to the data to manipulate
170    * in calling script. Eg. $_APP =& $obj->getData();
171    *
172    * @return mixed   A reference to the data
173    */
174    function &getData()
175    {
176        return $this->data;
177    }
178}
179?>