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中路径问题的解决方案
Oct 09 PHP
MySQL修改密码方法总结
Mar 25 PHP
关于使用coreseek并为其做分页的介绍
Jun 21 PHP
PHP函数extension_loaded()用法实例
Jan 19 PHP
PHP输出九九乘法表代码实例
Mar 27 PHP
php邮件发送的两种方式
Apr 28 PHP
php使用curl并发减少后端访问时间的方法分析
May 12 PHP
php实现背景图上添加圆形logo图标的方法
Nov 17 PHP
PHP数据分析引擎计算余弦相似度算法示例
Aug 08 PHP
kindeditor 加入七牛云上传的实例讲解
Nov 12 PHP
PHP安装BCMath扩展的方法
Feb 13 PHP
PHP7引入的&quot;??&quot;和&quot;?:&quot;的区别讲解
Apr 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
人大复印资料处理程序_补充篇
2006/10/09 PHP
php读取xml实例代码
2010/01/28 PHP
php数组函数序列之in_array() 查找数组值是否存在
2011/10/29 PHP
php urlencode()与urldecode()函数字符编码原理详解
2011/12/06 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
php实现的九九乘法口诀表简洁版
2014/07/28 PHP
php使用pclzip类实现文件压缩的方法(附pclzip类下载地址)
2016/04/30 PHP
PHP简单判断iPhone、iPad、Android及PC设备的方法
2016/10/11 PHP
PHP中字符串长度的截取用法示例
2017/01/12 PHP
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
jquery插件制作 提示框插件实现代码
2012/08/17 Javascript
JS实现的一个简单的Autocomplete自动完成例子
2014/04/16 Javascript
js实现checkbox全选和反选示例
2014/05/01 Javascript
jQuery判断多个input file 都不能为空的例子
2015/06/23 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
使用jquery获取url及url参数的简单实例
2016/06/14 Javascript
检查表单元素的值是否为空的实例代码
2016/06/16 Javascript
使用jquery给指定的table动态添加一行、删除一行
2016/10/13 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
如何获取元素的最终background-color
2017/02/06 Javascript
vue实现todolist单页面应用
2017/04/11 Javascript
Angular2.0实现modal对话框的方法示例
2018/02/18 Javascript
Web安全之XSS攻击与防御小结
2018/12/13 Javascript
js实现浏览器打印功能的示例代码
2020/07/15 Javascript
解决vue使用vant下拉框van-dropdown-item 绑定title值不变问题
2020/08/05 Javascript
Vue 3.0中jsx语法的使用
2020/11/13 Javascript
python类继承与子类实例初始化用法分析
2015/04/17 Python
python爬虫headers设置后无效的解决方法
2017/10/21 Python
使用python list 查找所有匹配元素的位置实例
2019/06/11 Python
Python如何基于selenium实现自动登录博客园
2019/12/16 Python
Python 中如何写注释
2020/08/28 Python
师范教师专业大学生职业生涯规划范文
2014/03/02 职场文书
大学班级计划书
2014/04/29 职场文书
村庄环境整治方案
2014/05/15 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
mysql函数全面总结
2021/11/11 MySQL