Zend Framework教程之Application用法实例详解


Posted in PHP onMarch 14, 2016

本文实例讲述了Zend Framework教程之Application用法。分享给大家供大家参考,具体如下:

Zend_Application是Zend Framework的核心组件。Zend_Application为Zend Framework应用程序提供基本功能,是程序的入口点。它的主要功能有两个:装载配置PHP环境(包括自动加载),并引导应用程序。

通常情况下,通过配置选项配置Zend_Application构造器,但也可以完全使用自定义方法配置。以下是两个使用用例。

Zend_Application配置选项

构造函数:

/**
 * Constructor
 *
 * Initialize application. Potentially initializes include_paths, PHP
 * settings, and bootstrap class.
 *
 * @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';
  $this->_autoloader = Zend_Loader_Autoloader::getInstance();
  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);
  }
}

Zend_Application配置方法

1.使用配置文件
2.使用配置数组

常见配置选项

Option Description
phpSettings 用于配置php.ini选项,要求是数组,数组的键应该是选项的的key.
includePaths 把附加的路径加入到include_path,要求是数组
autoloaderNamespaces 给Zend_Loader_Autoloader注册附加命名空间,为数组
bootstrap 可以是设置bootstrap引导类的路径的字符串,也可以是数组,数组元素要求为 'path' 和 'class'

注意:

选项名称不区分大小写。

Zend_Application的方法

Method Return Value Parameters Description
__construct( $environment,  $options = null) Void $environment: 必填。 表示当前应用环境的String。 典型的字符串可能包括 "development", "testing", "qa", or "production",他们必须已经被定义。 对应于配置文件文件中相关章节。 $options: 可选的,参数类型可能是: String :  指定Zend_Config 文件的配置路径. $environment 用于指定配置文件的哪一个章节 从1.10开始,可以设置多个配置文件路径,然后会被合并成一个单一的配置文件。 这样更灵活,便于重用。 在这种情况下的key是"config",其值是文件路径数组。 注:可以是路径字符串,或 array("config"=>array("/path1","/path2"[,...]));. Array : 配置应用的关联数组 Zend_Config:配置对象的实例 构造函数。 用于初始化配置对象。   实例化Zend_Loader_Autoloader。 通过传递给构造函数选项然后传递给setOptions()方法。
getEnvironment() String N/A 获取环境配置
getAutoloader() Zend_Loader_Autoloader N/A 获取Zend_Loader_Autoloader实例
setOptions(array $options) Zend_Application $options: 必填,要求是数组 所有选项都存储在引用内部,并多次调用该方法来合并选项。 会根据选项生产对于的setter方法。  例如,选项“phpSettings”对应setPhpSettings()。  (选项名称不区分大小写。)
getOptions() Array N/A
hasOption($key) Boolean $key: 判断是发有指定的配置 key不区分大小写。
getOption($key) Mixed $key: 获取指定的配置选项的值 key不区分大小写。如果不存在返回 NULL
setPhpSettings(array $settings, $prefix = '') Zend_Application $settings: 比填.PHP INI 的配置关联数组. $prefix: 可选. 为选项添加前缀
setAutoloaderNamespaces(array $namespaces) Zend_Application $namespaces: 必填.  传递命名空间字符串数组,通过Zend_Loader_Autoloader实例注册
setBootstrap($path, $class = null) Zend_Application $path: 必填.  可能是Zend_Application_Bootstrap_Bootstrapper实例, 自举类路径字符串,  格式为classname => filename的关联数组, 或key为“class”和value为“path”的关联数组。 $class: 可选. 如果 $path 是字符串, $class 类名称
getBootstrap() NULL |Zend_Application_Bootstrap_Bootstrapper N/A 获取注册的bootstrap实例.
bootstrap() Void N/A 调用 bootstrap的bootstrap() 引导应用.
run() Void N/A 调用bootstrap的 run()运行应用

配置举例:

默认:

// Create application, bootstrap, and run
$application = new Zend_Application(
  APPLICATION_ENV,
  APPLICATION_PATH . '/configs/application.ini'
);
$application->bootstrap()
      ->run();

源代码

<?php
class Zend_Application
{  /**
   * Constructor
   *
   * Initialize application. Potentially initializes include_paths, PHP
   * settings, and bootstrap class.
   *
   * @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';
    $this->_autoloader = Zend_Loader_Autoloader::getInstance();
    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'])) {
      $this->setPhpSettings($options['phpsettings']);
    }
    if (!empty($options['includepaths'])) {
      $this->setIncludePaths($options['includepaths']);
    }
    if (!empty($options['autoloadernamespaces'])) {
      $this->setAutoloaderNamespaces($options['autoloadernamespaces']);
    }
    if (!empty($options['autoloaderzfpath'])) {
      $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 = $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)
  {
  }
  /**
   * 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)
  {
    // 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);
    if (!$this->_bootstrap instanceof Zend_Application_Bootstrap_Bootstrapper) {
      throw new Zend_Application_Exception('Bootstrap class does not implement Zend_Application_Bootstrap_Bootstrapper');
    }
    return $this;
  }
  /**
   * Get bootstrap object
   *
   * @return Zend_Application_Bootstrap_BootstrapAbstract
   */
  public function getBootstrap()
  {
    if (null === $this->_bootstrap) {
      $this->_bootstrap = new Zend_Application_Bootstrap_Bootstrap($this);
    }
    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   = pathinfo($file, PATHINFO_EXTENSION);
    $suffix   = ($suffix === 'dist')
           ? pathinfo(basename($file, ".$suffix"), PATHINFO_EXTENSION)
           : $suffix;
    switch (strtolower($suffix)) {
      case 'ini':
        $config = new Zend_Config_Ini($file, $environment);
        break;
      case 'xml':
        $config = new Zend_Config_Xml($file, $environment);
        break;
      case 'json':
        $config = new Zend_Config_Json($file, $environment);
        break;
      case 'yaml':
      case 'yml':
        $config = new Zend_Config_Yaml($file, $environment);
        break;
      case 'php':
      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();
  }
}

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
Oracle 常见问题解答
Oct 09 PHP
同一空间绑定多个域名而实现访问不同页面的PHP代码
Dec 06 PHP
PHP网站安装程序制作的原理、步骤、注意事项和示例代码
Aug 01 PHP
PHP中通过加号合并数组的一个简单方法分享
Jan 27 PHP
PHP中读写文件实现代码
Oct 20 PHP
PHP句法规则详解 入门学习
Nov 09 PHP
PHP中替换键名的简易方法示例详解
Jan 07 PHP
thinkphp3.2中Lite文件替换框架入口文件或应用入口文件的方法
May 21 PHP
PHP分页初探 一个最简单的PHP分页代码的简单实现
Jun 21 PHP
ThinkPHP+EasyUI之ComboTree中的会计科目树形菜单实现方法
Jun 09 PHP
PHP封装mysqli基于面向对象的mysql数据库操作类与用法示例
Feb 25 PHP
PHP实现文件上传与下载
Aug 28 PHP
Zend Framework自定义Helper类相关注意事项总结
Mar 14 #PHP
Zend Framework教程之Bootstrap类用法概述
Mar 14 #PHP
如何解决PHP使用mysql_query查询超大结果集超内存问题
Mar 14 #PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 #PHP
PHP访问数据库集群的方法小结
Mar 14 #PHP
php 无限级分类 获取顶级分类ID
Mar 13 #PHP
PHP实现文件上传与下载实例与总结
Mar 13 #PHP
You might like
DOTA2 1月28日更新:监管系统降临刀塔世界
2021/01/28 DOTA
PHP内核介绍及扩展开发指南―基础知识
2011/09/11 PHP
PHP教程之PHP中shell脚本的使用方法分享
2012/02/23 PHP
php文件上传的简单实例
2013/10/19 PHP
小谈php正则提取图片地址
2014/03/27 PHP
php用正则判断是否为数字的方法
2016/03/25 PHP
yii2 在控制器中验证请求参数的使用方法
2019/06/19 PHP
Jquery下:nth-child(an+b)的使用注意
2011/05/28 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
基于js实现投票的实例代码
2015/08/04 Javascript
jQuery地图map悬停显示省市代码分享
2015/08/20 Javascript
Angular Js文件上传之form-data
2015/08/28 Javascript
基于javascript实现根据身份证号码识别性别和年龄
2016/01/22 Javascript
HTML页面,测试JS对C函数的调用简单实例
2016/08/09 Javascript
浅析location.href跨窗口调用函数
2016/11/22 Javascript
Vue自定义指令使用方法详解
2017/08/21 Javascript
Vue 使用 Mint UI 实现左滑删除效果CellSwipe
2018/04/27 Javascript
微信小程序 setData 对 data数据影响问题
2019/04/18 Javascript
jQuery中使用validate插件校验表单功能
2019/05/24 jQuery
JavaScript如何判断对象有某属性
2020/07/03 Javascript
jQuery实现动态向上滚动
2020/12/21 jQuery
Python利用IPython提高开发效率
2016/08/10 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
使用python 和 lint 删除项目无用资源的方法
2017/12/20 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
python实现简单五子棋游戏
2019/06/18 Python
Python pandas.DataFrame调整列顺序及修改index名的方法
2019/06/21 Python
virtualenv介绍及简明教程
2020/06/23 Python
Python基于Webhook实现github自动化部署
2020/11/28 Python
StubHub哥伦比亚:购买和出售您的门票
2016/10/20 全球购物
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
Lookfantastic瑞典:英国知名美妆购物网站
2018/04/06 全球购物
医院病假条怎么写
2015/08/17 职场文书
幼儿教师师德培训心得体会
2016/01/09 职场文书
基于JavaScript实现省市联动效果
2021/06/22 Javascript
MutationObserver在页面水印实现起到的作用详解
2022/07/07 Javascript