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安装全攻略:APACHE
Oct 09 PHP
实现 win2003 下 mysql 数据库每天自动备份
Dec 06 PHP
PHP 采集程序原理分析篇
Mar 05 PHP
PHP FOR MYSQL 代码生成助手(根据Mysql里的字段自动生成类文件的)
Jul 23 PHP
PHP中文件读、写、删的操作(PHP中对文件和目录操作)
Mar 06 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
Apr 28 PHP
zend optimizer在wamp的基础上安装图文教程
Oct 26 PHP
php无限遍历文件夹示例分享
Mar 04 PHP
php浏览历史记录的方法
Mar 10 PHP
WordPress中使主题支持小工具以及添加插件启用函数
Dec 22 PHP
PHP实现将上传图片自动缩放到指定分辨率,并保持清晰度封装类示例
Jun 17 PHP
PHP实现时间日期友好显示实现代码
Sep 08 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
BBS(php &amp; mysql)完整版(八)
2006/10/09 PHP
PHP 编写大型网站问题集
2010/05/07 PHP
基于php在各种web服务器的运行模式详解
2013/06/03 PHP
PHP下载远程图片并保存到本地方法总结
2016/01/22 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
Windows Live的@live.com域名注册漏洞 利用代码
2006/12/27 Javascript
JQuery.ajax传递中文参数的解决方法 推荐
2011/03/28 Javascript
jQuery prev ~ siblings选择器使用介绍
2013/08/09 Javascript
javascript中的变量作用域以及变量提升详细介绍
2013/10/24 Javascript
微信内置浏览器私有接口WeixinJSBridge介绍
2015/05/25 Javascript
javascript事件冒泡和事件捕获详解
2015/05/26 Javascript
jquery实现的Banner广告收缩效果代码
2015/09/02 Javascript
Bootstrap实现响应式导航栏效果
2015/12/28 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
超实用的javascript时间处理总结
2016/08/16 Javascript
js+css实现打字效果
2020/06/24 Javascript
Vue源码解析之Template转化为AST的实现方法
2018/12/14 Javascript
详解vue中移动端自适应方案
2019/05/05 Javascript
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
Vue如何实现监听组件原生事件
2020/07/03 Javascript
关于uniApp editor微信滑动问题
2021/01/15 Javascript
详解Vite的新体验
2021/02/22 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
python自动化测试之setUp与tearDown实例
2014/09/28 Python
Python使用wxPython实现计算器
2018/01/30 Python
python爬虫爬取淘宝商品信息(selenum+phontomjs)
2018/02/24 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
Python爬虫实现获取动态gif格式搞笑图片的方法示例
2018/12/24 Python
用HTML5 实现橡皮擦的涂抹效果的教程
2015/05/11 HTML / CSS
REISS英国官网:伦敦High Street最受欢迎品牌
2016/12/21 全球购物
台湾团购、宅配和优惠券:17Life
2017/08/14 全球购物
"火柴棍式"程序员面试题
2014/03/16 面试题
如何删除一个表里面的重复行
2013/07/13 面试题
生产厂长岗位职责
2014/02/21 职场文书
JavaScript实例 ODO List分析
2022/01/22 Javascript
win10更新失败无限重启解决方法
2022/04/19 数码科技