File indexing completed on 2024-04-28 06:00:03

0001 <?php
0002 /**
0003  * Zend Framework
0004  *
0005  * LICENSE
0006  *
0007  * This source file is subject to the new BSD license that is bundled
0008  * with this package in the file LICENSE.txt.
0009  * It is also available through the world-wide-web at this URL:
0010  * http://framework.zend.com/license/new-bsd
0011  * If you did not receive a copy of the license and are unable to
0012  * obtain it through the world-wide-web, please send an email
0013  * to license@zend.com so we can send you a copy immediately.
0014  *
0015  * @category   Zend
0016  * @package    Zend_Serializer
0017  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0018  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0019  * @version    $Id$
0020  */
0021 
0022 /** @see Zend_Loader_PluginLoader */
0023 // require_once 'Zend/Loader/PluginLoader.php';
0024 
0025 /**
0026  * @category   Zend
0027  * @package    Zend_Serializer
0028  * @copyright  Copyright (c) 2005-2015 Zend Technologies USA Inc. (http://www.zend.com)
0029  * @license    http://framework.zend.com/license/new-bsd     New BSD License
0030  */
0031 class Zend_Serializer
0032 {
0033     /**
0034      * Plugin loader to load adapter.
0035      *
0036      * @var null|Zend_Loader_PluginLoader
0037      */
0038     private static $_adapterLoader = null;
0039 
0040     /**
0041      * The default adapter.
0042      *
0043      * @var string|Zend_Serializer_AdapterInterface
0044      */
0045     protected static $_defaultAdapter = 'PhpSerialize';
0046 
0047     /**
0048      * Create a serializer adapter instance.
0049      *
0050      * @param string|Zend_Serializer_Adapter_AdapterInterface $adapterName Name of the adapter class
0051      * @param array |Zend_Config $opts Serializer options
0052      * @return Zend_Serializer_Adapter_AdapterInterface
0053      */
0054     public static function factory($adapterName, $opts = array())
0055     {
0056         if ($adapterName instanceof Zend_Serializer_Adapter_AdapterInterface) {
0057             return $adapterName; // $adapterName is already an adapter object
0058         }
0059 
0060         $adapterLoader = self::getAdapterLoader();
0061         try {
0062             $adapterClass = $adapterLoader->load($adapterName);
0063         } catch (Exception $e) {
0064             // require_once 'Zend/Serializer/Exception.php';
0065             throw new Zend_Serializer_Exception('Can\'t load serializer adapter "'.$adapterName.'"', 0, $e);
0066         }
0067 
0068         // ZF-8842:
0069         // check that the loaded class implements Zend_Serializer_Adapter_AdapterInterface without execute code
0070         if (!in_array('Zend_Serializer_Adapter_AdapterInterface', class_implements($adapterClass))) {
0071             // require_once 'Zend/Serializer/Exception.php';
0072             throw new Zend_Serializer_Exception('The serializer adapter class "'.$adapterClass.'" must implement Zend_Serializer_Adapter_AdapterInterface');
0073         }
0074 
0075         return new $adapterClass($opts);
0076     }
0077 
0078     /**
0079      * Get the adapter plugin loader.
0080      *
0081      * @return Zend_Loader_PluginLoader
0082      */
0083     public static function getAdapterLoader()
0084     {
0085         if (self::$_adapterLoader === null) {
0086             self::$_adapterLoader = self::_getDefaultAdapterLoader();
0087         }
0088         return self::$_adapterLoader;
0089     }
0090 
0091     /**
0092      * Change the adapter plugin load.
0093      *
0094      * @param  Zend_Loader_PluginLoader $pluginLoader
0095      * @return void
0096      */
0097     public static function setAdapterLoader(Zend_Loader_PluginLoader $pluginLoader)
0098     {
0099         self::$_adapterLoader = $pluginLoader;
0100     }
0101 
0102     /**
0103      * Resets the internal adapter plugin loader
0104      *
0105      * @return Zend_Loader_PluginLoader
0106      */
0107     public static function resetAdapterLoader()
0108     {
0109         self::$_adapterLoader = self::_getDefaultAdapterLoader();
0110         return self::$_adapterLoader;
0111     }
0112 
0113     /**
0114      * Returns a default adapter plugin loader
0115      *
0116      * @return Zend_Loader_PluginLoader
0117      */
0118     protected static function _getDefaultAdapterLoader()
0119     {
0120         $loader = new Zend_Loader_PluginLoader();
0121         $loader->addPrefixPath('Zend_Serializer_Adapter', dirname(__FILE__).'/Serializer/Adapter');
0122         return $loader;
0123     }
0124 
0125     /**
0126      * Change the default adapter.
0127      *
0128      * @param string|Zend_Serializer_Adapter_AdapterInterface $adapter
0129      * @param array|Zend_Config $options
0130      */
0131     public static function setDefaultAdapter($adapter, $options = array())
0132     {
0133         self::$_defaultAdapter = self::factory($adapter, $options);
0134     }
0135 
0136     /**
0137      * Get the default adapter.
0138      *
0139      * @return Zend_Serializer_Adapter_AdapterInterface
0140      */
0141     public static function getDefaultAdapter()
0142     {
0143         if (!self::$_defaultAdapter instanceof Zend_Serializer_Adapter_AdapterInterface) {
0144             self::setDefaultAdapter(self::$_defaultAdapter);
0145         }
0146         return self::$_defaultAdapter;
0147     }
0148 
0149     /**
0150      * Generates a storable representation of a value using the default adapter.
0151      *
0152      * @param mixed $value
0153      * @param array $options
0154      * @return string
0155      * @throws Zend_Serializer_Exception
0156      */
0157     public static function serialize($value, array $options = array())
0158     {
0159         if (isset($options['adapter'])) {
0160             $adapter = self::factory($options['adapter']);
0161             unset($options['adapter']);
0162         } else {
0163             $adapter = self::getDefaultAdapter();
0164         }
0165 
0166         return $adapter->serialize($value, $options);
0167     }
0168 
0169     /**
0170      * Creates a PHP value from a stored representation using the default adapter.
0171      *
0172      * @param string $serialized
0173      * @param array $options
0174      * @return mixed
0175      * @throws Zend_Serializer_Exception
0176      */
0177     public static function unserialize($serialized, array $options = array())
0178     {
0179         if (isset($options['adapter'])) {
0180             $adapter = self::factory($options['adapter']);
0181             unset($options['adapter']);
0182         } else {
0183             $adapter = self::getDefaultAdapter();
0184         }
0185 
0186         return $adapter->unserialize($serialized, $options);
0187     }
0188 }