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 相关文章推荐
定制404错误页面,并发信给管理员的程序
Oct 09 PHP
php递归列出所有文件和目录的代码
Sep 10 PHP
Zend framework处理一个http请求的流程分析
Feb 08 PHP
php 文章调用类代码
Aug 11 PHP
php while循环得到循环次数
Oct 26 PHP
PHP中一些可以替代正则表达式函数的字符串操作函数
Nov 17 PHP
在PHP站点的页面上添加Facebook评论插件的实例教程
Jan 08 PHP
CI框架AR操作(数组形式)实现插入多条sql数据的方法
May 18 PHP
让你的PHP7更快之Hugepage用法分析
May 31 PHP
PHP封装的PDO数据库操作类实例
Jun 21 PHP
Laravel框架实现的上传图片到七牛功能详解
Sep 06 PHP
thinkphp5 + ajax 使用formdata提交数据(包括文件上传) 后台返回json完整实例
Mar 02 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
探讨:array2xml和xml2array以及xml与array的互相转化
2013/06/24 PHP
PHP 验证身份证是否合法的函数
2017/02/09 PHP
PHP检查网站是否宕机的方法示例
2017/07/24 PHP
javascript之大字符串的连接的StringBuffer 类
2007/05/08 Javascript
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
基于jquery的一个浮动框(扩展性比较好 )
2010/08/27 Javascript
JavaScript字符串插入、删除、替换函数使用示例
2013/07/25 Javascript
jQuery中获取checkbox选中项等操作及注意事项
2013/11/24 Javascript
js判断元素是否隐藏的方法
2014/06/09 Javascript
解析javascript中鼠标滚轮事件
2015/05/26 Javascript
jQuery EasyUI实现右键菜单变灰不可用效果
2015/09/24 Javascript
基于javascript制作经典传统的拼图游戏
2016/03/22 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
2016/10/26 Javascript
Vue.js教程之计算属性
2016/11/11 Javascript
jQuery如何跳转到另一个网页 就这么简单
2016/12/28 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
vue 运用mock数据的示例代码
2017/11/07 Javascript
ztree加载完成后显示勾选节点的实现代码
2018/10/22 Javascript
vue 实现微信浮标效果
2019/09/01 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
使用python分析git log日志示例
2014/02/27 Python
使用Python实现BT种子和磁力链接的相互转换
2015/11/09 Python
详解Anconda环境下载python包的教程(图形界面+命令行+pycharm安装)
2019/11/11 Python
基于python使用tibco ems代码实例
2019/12/20 Python
利用setuptools打包python程序的方法步骤
2020/01/18 Python
基于python爬取梨视频实现过程解析
2020/11/09 Python
英国在线药房:Express Chemist
2019/03/28 全球购物
先进党支部事迹材料
2014/01/13 职场文书
自我鉴定四大框架
2014/01/17 职场文书
干部现实表现材料
2014/02/13 职场文书
2014年高考决心书
2014/03/11 职场文书
公安机关纪律作风整顿个人剖析材料材料
2014/10/10 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
Golang二维切片初始化的实现
2021/04/08 Golang
Python基础知识之变量的详解
2021/04/14 Python
Redis读写分离搭建的完整步骤
2021/09/14 Redis