Zend Framework教程之模型Model基本规则和使用方法


Posted in PHP onMarch 04, 2016

本文实例讲述了Zend Framework教程之模型Model基本规则和使用方法。分享给大家供大家参考,具体如下:

这里讲讲Zend中的model。其实Zend中的Model处理是相当简单的。

这主要得益于autoload功能。不像其它框架,为model定义复杂的基类。

如果要定义model,不得不要继承一个model的基类,才可以使用具体的功能。

Zend中并没有对模型进行封装。

原因大概是Model主要是和具体业务逻辑相关的,进行过多的封装,只会画蛇添足。

Zend使用了autoload和namespace功能,很委婉的解决了这个问题。

创建一个zendframework项目model_demo1

为了方便查看错误我们可以在配置文件中/model_demo1/application/configs/application.ini打开错误信息开关如下:

phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
resources.frontController.params.displayExceptions = 1

接下来简单的讲讲zend中的model:

1.默认的Model

一个标准的webapp中会有application/models这样的目录。不难看出,models用来存放你的app的model

这个目录的强大之处在于,如果你在models目录中定义了具体的class。zend会自动的帮我们加载,当然要遵循一定的约定,前提是:

例如,用zf命令行创建一个名为Test的Model

zf create model Test

Creating a model at /www/model_demo1/application/models/Test.php

Updating project profile '/www/model_demo1/.zfproject.xml'

刷新一下项目目录可以看到,新增了如下文件/model_demo1/application/models/Test.php

文件内容如下:

<?php
class Application_Model_Test
{}

不难看出我们要使用Model要遵循如下规则:

1).以Application_Model_开头,然后后面是自定义的model的类名称。

即:我们web应用的model的目录结构为/model_demo1/application/models/Test.php

对应的命名空间为Application_Model_Test。

application对应Application

models对应models

Test是model的类文件的名称。

类的名称按照约束就是:class Application_Model_Test {

也不难理解Application_Model_,这样的规则遵循zend framework的autoload和namespace的约定。

2).Application命名空间

其实Application也是我们在配置文件中配置的应用的命名空间。

如果把配置文件的appnamespace = "Application"修改为appnamespace = "App"。

我们原先的程序,就会报错了。原因不言而喻。所以zend也没有那么智能。

如果要详细追究其原理,大概是如下的类完成这个功能的:

Zend_Application_Bootstrap_Bootstrap
Zend_Application_Module_Autoloader

2.自定义命名空间

Zend是默认的命名空间。例如在/model_demo1/library/Zend/Test.php创建类Zend_Test

<?php
class Zend_Test{
 static public function echoZendTest(){
  echo 'ZendTest<br/>';
 }
}

不需要做任何操作,就可以在程序中使用。例如:Zend_Test::echoZendTest();
这里简单说明自定义命名空间的两种方法:

1).使用application.ini配置文件

默认命名空间

appnamespace = "Application"

自定义命名空间

autoloadernamespaces.app = "App_"
autoloadernamespaces.my = "MyApp_"

或者

autoloadernamespaces[] = "App_"
autoloadernamespaces[] = "MyApp_"

具体实现类为:Zend\Application.php

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']);
 }

2).在Bootstrap.php文件中

例如/model_demo1/application/Bootstrap.php

<?php
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
 protected function _initAutoload() {
  $app = $this->getApplication ();
  $namespaces = array (
    'AppTest'
  );
  $app->setAutoloaderNamespaces ( $namespaces );
  return $app;
 }
}

/model_demo1/library/AppTest/Test.php

<?php
class AppTest_Test{
 static public function echoAppTestTest(){
  echo 'AppTestTest<br/>';
 }
}

/model_demo1/application/controllers/IndexController.php

AppTest_Test::echoAppTestTest();

3).使用具体的类完成自动加载

$auto_loader = Zend_Loader_Autoloader::getInstance();
$resourceLoader = new Zend_Loader_Autoloader_Resource(array(
  'basePath' => '/www/model_demo1/application',
  'namespace' => '',
  'resourceTypes' => array(
    'model' => array(
      'path' => 'models',
      'namespace' => 'Model'
    )
  )
)
);
$auto_loader->pushAutoloader($resourceLoader);
$auto_loader->registerNamespace(array('AppTest2_'));
AppTest2_Test::echoAppTest2Test();
Model_ModelTest::echoModelModelTest();

/model_demo1/application/models/ModelTest.php

<?php
class Model_ModelTest{
 static function echoModelModelTest(){
  echo 'Model_ModelTest<br/>';
 }
}

/model_demo1/library/AppTest2/Test.php

<?php
class AppTest2_Test{
 static public function echoAppTest2Test(){
  echo 'AppTest2Test<br/>';
 }
}

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

PHP 相关文章推荐
在php中使用sockets:从新闻组中获取文章
Oct 09 PHP
Windows PHP5和Apache的安装与配置
Jun 08 PHP
开启CURL扩展,让服务器支持PHP curl函数(远程采集)
Mar 19 PHP
用php实现选择排序的解决方法
May 04 PHP
codeigniter框架批量插入数据
Jan 09 PHP
PHP把JPEG图片转换成Progressive JPEG的方法
Jun 30 PHP
php实现扫描二维码根据浏览器类型访问不同下载地址
Oct 15 PHP
详解WordPress开发中get_header()获取头部函数的用法
Jan 08 PHP
php支付宝在线支付接口开发教程
Sep 19 PHP
详解Yii2 定制表单输入字段的标签和样式
Jan 04 PHP
php 函数使用可变数量的参数方法
May 02 PHP
CodeIgniter框架实现的整合Smarty引擎DEMO示例
Mar 28 PHP
Zend Framework教程之Zend_Layout布局助手详解
Mar 04 #PHP
php mailer类调用远程SMTP服务器发送邮件实现方法
Mar 04 #PHP
PHP使用curl模拟post上传及接收文件的方法
Mar 04 #PHP
PHP生成和获取XML格式数据的方法
Mar 04 #PHP
PHP使用fopen与file_get_contents读取文件实例分享
Mar 04 #PHP
PHP截取IE浏览器并缩小原图的方法
Mar 04 #PHP
zend framework中使用memcache的方法
Mar 04 #PHP
You might like
我的论坛源代码(二)
2006/10/09 PHP
php实现httpRequest的方法
2015/03/13 PHP
php实现smarty模板无限极分类的方法
2015/12/07 PHP
jquery 表单下所有元素的隐藏
2009/07/25 Javascript
Javascript Global对象
2009/08/13 Javascript
基于jquery实现的服务器验证控件的启用和禁用代码
2010/04/27 Javascript
javascript如何写热点图
2015/12/08 Javascript
详解javascript跨浏览器事件处理程序
2016/03/27 Javascript
AngularJs Injecting Services Into Controllers详解
2016/09/02 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
微信小程序之电影影评小程序制作代码
2017/08/03 Javascript
webpack打包react项目的实现方法
2018/06/21 Javascript
详解react内联样式使用webpack将px转rem
2018/09/13 Javascript
详解python基础之while循环及if判断
2017/08/24 Python
Python实现将数据写入netCDF4中的方法示例
2018/08/30 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
python被修饰的函数消失问题解决(基于wraps函数)
2019/11/04 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Numpy 多维数据数组的实现
2020/06/18 Python
Python如何实现线程间通信
2020/07/30 Python
python 实时调取摄像头的示例代码
2020/11/25 Python
浅谈HTML5中dialog元素尝鲜
2018/10/15 HTML / CSS
施华洛世奇英国官网:SWAROVSKI英国
2017/03/13 全球购物
意大利在线购买隐形眼镜网站:VisionDirect.it
2019/03/18 全球购物
GUESS Factory加拿大:牛仔裤、服装及配饰
2019/09/20 全球购物
北京银河万佳Java面试题
2012/03/21 面试题
小学校园活动策划
2014/01/30 职场文书
基督教婚礼主持词
2014/03/14 职场文书
就业推荐表自我鉴定
2014/03/21 职场文书
企业文化标语口号
2014/06/09 职场文书
放飞理想演讲稿
2014/09/09 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
工作犯错保证书
2015/05/11 职场文书
工作服管理制度范本
2015/08/06 职场文书
家访教师心得体会
2016/01/23 职场文书
2016优秀青年志愿者事迹材料
2016/02/25 职场文书