zend原始碼分析Application.php

來源:互聯網
上載者:User
<?php/** * Zend Framework * * LICENSE * * This source file is subject to the new BSD license that is bundled * with this package in the file LICENSE.txt. * It is also available through the world-wide-web at this URL: * http://framework.zend.com/license/new-bsd * If you did not receive a copy of the license and are unable to * obtain it through the world-wide-web, please send an email * to license@zend.com so we can send you a copy immediately. * * @category   Zend * @package    Zend_Application * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License * @version    $Id: Application.php 20096 2010-01-06 02:05:09Z bkarwin $ *//** * @category   Zend * @package    Zend_Application * @copyright  Copyright (c) 2005-2010 Zend Technologies USA Inc. (http://www.zend.com) * @license    http://framework.zend.com/license/new-bsd     New BSD License */class Zend_Application{    /**     * Autoloader to use     *     * @var Zend_Loader_Autoloader     */    protected $_autoloader;//自動載入    /**     * Bootstrap     *     * @var Zend_Application_Bootstrap_BootstrapAbstract     */    protected $_bootstrap;//bootstrap    /**     * Application environment     *     * @var string     */    protected $_environment;//環境    /**     * Flattened (lowercase) option keys     *     * @var array     */    protected $_optionKeys = array();//選項key數組    /**     * Options for Zend_Application     *     * @var array     */    protected $_options = array();//選項數組    /**     * Constructor構造器     *     * Initialize application. Potentially initializes include_paths, PHP     * settings, and bootstrap class.     * 應用初始化。初始化include_path,php相關inisetting,和bootstrap類     *     * @param  string                   $environment     * @param  string|array|Zend_Config $options String path to configuration file, or array/Zend_Config of configuration options     * @throws Zend_Application_Exception When invalid options are provided     * @return void     */    public function __construct($environment, $options = null)    {        $this->_environment = (string) $environment;        require_once 'Zend/Loader/Autoloader.php';//載入zend_loader類        $this->_autoloader = Zend_Loader_Autoloader::getInstance();//單例模式執行個體化autoloader對象        if (null !== $options) {//選項數組不為空白時            if (is_string($options)) {//字串類型選項數組                $options = $this->_loadConfig($options);//載入選項數組            } elseif ($options instanceof Zend_Config) {                $options = $options->toArray();            } elseif (!is_array($options)) {                throw new Zend_Application_Exception('Invalid options provided; must be location of config file, a config object, or an array');            }            $this->setOptions($options);        }    }    /**     * Retrieve current environment     * 擷取當前環境     * @return string     */    public function getEnvironment()    {        return $this->_environment;    }    /**     * Retrieve autoloader instance     *     * @return Zend_Loader_Autoloader     */    public function getAutoloader()    {        return $this->_autoloader;    }    /**     * Set application options     *     * @param  array $options     * @throws Zend_Application_Exception When no bootstrap path is provided     * @throws Zend_Application_Exception When invalid bootstrap information are provided     * @return Zend_Application     */    public function setOptions(array $options)//設定選項    {        if (!empty($options['config'])) {            if (is_array($options['config'])) {                $_options = array();                foreach ($options['config'] as $tmp) {                    $_options = $this->mergeOptions($_options, $this->_loadConfig($tmp));                }                $options = $this->mergeOptions($_options, $options);            } else {                $options = $this->mergeOptions($this->_loadConfig($options['config']), $options);            }        }        $this->_options = $options;        $options = array_change_key_case($options, CASE_LOWER);        $this->_optionKeys = array_keys($options);        if (!empty($options['phpsettings'])) {//option中有phpsetting節點            $this->setPhpSettings($options['phpsettings']);//做phpini設定        }        if (!empty($options['includepaths'])) {//option中有includepath節點            $this->setIncludePaths($options['includepaths']);//設定includepath        }        if (!empty($options['autoloadernamespaces'])) {//option中有名字空間節點            $this->setAutoloaderNamespaces($options['autoloadernamespaces']);//設定自動載入名字空間        }        if (!empty($options['autoloaderzfpath'])) {//option中有自動載入zf路徑            $autoloader = $this->getAutoloader();            if (method_exists($autoloader, 'setZfPath')) {                $zfPath    = $options['autoloaderzfpath'];                $zfVersion = !empty($options['autoloaderzfversion'])                           ? $options['autoloaderzfversion']                           : 'latest';                $autoloader->setZfPath($zfPath, $zfVersion);            }        }        if (!empty($options['bootstrap'])) {//節點中有bootstrap            $bootstrap = $options['bootstrap'];//取出賦值為數組            if (is_string($bootstrap)) {                $this->setBootstrap($bootstrap);            } elseif (is_array($bootstrap)) {                if (empty($bootstrap['path'])) {                    throw new Zend_Application_Exception('No bootstrap path provided');                }                $path  = $bootstrap['path'];                $class = null;                if (!empty($bootstrap['class'])) {                    $class = $bootstrap['class'];                }                $this->setBootstrap($path, $class);            } else {                throw new Zend_Application_Exception('Invalid bootstrap information provided');            }        }        return $this;    }    /**     * Retrieve application options (for caching)     *     * @return array     */    public function getOptions()    {        return $this->_options;    }    /**     * Is an option present?     *     * @param  string $key     * @return bool     */    public function hasOption($key)    {        return in_array(strtolower($key), $this->_optionKeys);    }    /**     * Retrieve a single option     *     * @param  string $key     * @return mixed     */    public function getOption($key)    {        if ($this->hasOption($key)) {            $options = $this->getOptions();            $options = array_change_key_case($options, CASE_LOWER);            return $options[strtolower($key)];        }        return null;    }    /**     * Merge options recursively     *     * @param  array $array1     * @param  mixed $array2     * @return array     */    public function mergeOptions(array $array1, $array2 = null)    {        if (is_array($array2)) {            foreach ($array2 as $key => $val) {                if (is_array($array2[$key])) {                    $array1[$key] = (array_key_exists($key, $array1) && is_array($array1[$key]))                                  ? $this->mergeOptions($array1[$key], $array2[$key])                                  : $array2[$key];                } else {                    $array1[$key] = $val;                }            }        }        return $array1;    }    /**     * Set PHP configuration settings     *     * @param  array $settings     * @param  string $prefix Key prefix to prepend to array values (used to map . separated INI values)     * @return Zend_Application     */    public function setPhpSettings(array $settings, $prefix = '')    {        foreach ($settings as $key => $value) {            $key = empty($prefix) ? $key : $prefix . $key;            if (is_scalar($value)) {                ini_set($key, $value);            } elseif (is_array($value)) {                $this->setPhpSettings($value, $key . '.');            }        }        return $this;    }    /**     * Set include path     *     * @param  array $paths     * @return Zend_Application     */    public function setIncludePaths(array $paths)    {        $path = implode(PATH_SEPARATOR, $paths);        set_include_path($path . PATH_SEPARATOR . get_include_path());        return $this;    }    /**     * Set autoloader namespaces     *     * @param  array $namespaces     * @return Zend_Application     */    public function setAutoloaderNamespaces(array $namespaces)    {        $autoloader = $this->getAutoloader();        foreach ($namespaces as $namespace) {            $autoloader->registerNamespace($namespace);        }        return $this;    }    /**     * Set bootstrap path/class     *     * @param  string $path     * @param  string $class     * @return Zend_Application     */    public function setBootstrap($path, $class = null)//設定bootstrap    {        // setOptions() can potentially send a null value; specify default        // here        if (null === $class) {            $class = 'Bootstrap';        }        if (!class_exists($class, false)) {            require_once $path;            if (!class_exists($class, false)) {                throw new Zend_Application_Exception('Bootstrap class not found');            }        }        $this->_bootstrap = new $class($this);//執行個體化一個bootstrap對象,設定為application對象的屬性        if (!$this->_bootstrap instanceof Zend_Application_Bootstrap_Bootstrapper) {            throw new Zend_Application_Exception('Bootstrap class does not implement Zend_Application_Bootstrap_Bootstrapper');        }        return $this;//返回bootstrap對象    }    /**     * Get bootstrap object     *     * @return Zend_Application_Bootstrap_BootstrapAbstract     */    public function getBootstrap()//擷取bootstrap類    {        if (null === $this->_bootstrap) {//當前bootstrap類為空白            $this->_bootstrap = new Zend_Application_Bootstrap_Bootstrap($this);//執行個體化bootstrap類,傳入參數當前的application對象        }        return $this->_bootstrap;    }    /**     * Bootstrap application     *     * @param  null|string|array $resource     * @return Zend_Application     */    public function bootstrap($resource = null)    {        $this->getBootstrap()->bootstrap($resource);        return $this;    }    /**     * Run the application     *     * @return void     */    public function run()    {        $this->getBootstrap()->run();    }    /**     * Load configuration file of options     * 載入設定檔中的選項     * @param  string $file     * @throws Zend_Application_Exception When invalid configuration file is provided     * @return array     */    protected function _loadConfig($file)    {        $environment = $this->getEnvironment();//載入當前工作環境到變數        $suffix      = strtolower(pathinfo($file, PATHINFO_EXTENSION));//擷取config檔案的尾碼名        switch ($suffix) {            case 'ini':                $config = new Zend_Config_Ini($file, $environment);//載入ini類型的設定檔                break;            case 'xml':                $config = new Zend_Config_Xml($file, $environment);//載入xml類型的設定檔                break;            case 'php'://與inc格式的設定檔相同            case 'inc':                $config = include $file;//直接包含檔案                if (!is_array($config)) {                    throw new Zend_Application_Exception('Invalid configuration file provided; PHP file does not return array value');//檔案採用數組配置,若非數組,則拋出異常                }                return $config;                break;            default:                throw new Zend_Application_Exception('Invalid configuration file provided; unknown config type');        }        return $config->toArray();    }}
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.