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版自动生成文章摘要
Jul 23 PHP
php产生随机数的两种方法实例代码 输出随机IP
Apr 08 PHP
php中常用字符串处理代码片段整理
Nov 07 PHP
分享下页面关键字抓取components.arrow.com站点代码
Jan 30 PHP
PHP中的命名空间相关概念浅析
Jan 22 PHP
php生成zip文件类实例
Apr 07 PHP
用PHP写的一个冒泡排序法的函数简单实例
May 26 PHP
php 计算两个时间相差的天数、小时数、分钟数、秒数详解及实例代码
Nov 09 PHP
php正则表达式基本知识与应用详解【经典教程】
Apr 17 PHP
Thinkphp3.2简单解决多文件上传只上传一张的问题
Sep 26 PHP
Yii2结合Workerman的websocket示例详解
Sep 10 PHP
PHP实现提取多维数组指定一列的方法总结
Dec 04 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
php curl 上传文件代码实例
2015/04/27 PHP
PHP 下载文件时如何自动添加bom头及解释BOM头和去掉bom头的方法
2016/01/04 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
2018/05/28 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
详解PHP 二维数组排序保持键名不变
2019/03/06 PHP
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
JS实现同时搜索百度和必应的方法
2015/01/27 Javascript
AngularJS入门教程之表格实例详解
2016/07/27 Javascript
JS基于递归算法实现1,2,3,4,5,6,7,8,9倒序放入数组中的方法
2017/01/03 Javascript
jQuery实现切换隐藏与显示同时切换图标功能
2017/10/29 jQuery
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
JSONP解决JS跨域问题的实现
2020/05/25 Javascript
three.js欧拉角和四元数的使用方法
2020/07/26 Javascript
Vue props中Object和Array设置默认值操作
2020/07/30 Javascript
Vue中computed和watch有哪些区别
2020/12/19 Vue.js
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
Python提示[Errno 32]Broken pipe导致线程crash错误解决方法
2014/11/19 Python
Python简单日志处理类分享
2015/02/14 Python
十个Python程序员易犯的错误
2015/12/15 Python
Python 读取某个目录下所有的文件实例
2018/06/23 Python
Ubuntu下升级 python3.7.1流程备忘(推荐)
2018/12/10 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
我们为什么要减少Python中循环的使用
2019/07/10 Python
tensorflow实现从.ckpt文件中读取任意变量
2020/05/26 Python
Python爬虫之Spider类用法简单介绍
2020/08/04 Python
法国家具及室内配件店:home24
2017/01/21 全球购物
trivago美国:全球最大的酒店价格比较网站
2018/01/18 全球购物
美国廉价机票预订网站:Cheapfaremart
2018/04/28 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
安全保证书怎么写
2015/02/28 职场文书
实习生辞职信范文
2015/03/02 职场文书
Python进度条的使用
2021/05/17 Python
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
MySQL学习之基础命令实操总结
2022/03/19 MySQL
Python之matplotlib绘制折线图
2022/04/13 Python