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 相关文章推荐
全文搜索和替换
Oct 09 PHP
php自定义函数call_user_func和call_user_func_array详解
Jul 14 PHP
关于PHP session 存储方式的详细介绍
Jun 25 PHP
php计算数组不为空元素个数的方法
Jan 27 PHP
给ECShop添加最新评论
Jan 07 PHP
php绘制一条直线的方法
Jan 24 PHP
php模拟post提交数据的方法
Feb 12 PHP
php找出指定范围内回文数且平方根也是回文数的方法
Mar 23 PHP
php查询whois信息的方法
Jun 08 PHP
CodeIgniter整合Smarty的方法详解
Aug 25 PHP
PHP中Static(静态)关键字功能与用法实例分析
Apr 05 PHP
Laravel5.4简单实现app接口Api Token认证方法
Aug 29 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
摩卡咖啡
2021/03/03 咖啡文化
PHP实现MySQL更新记录的代码
2008/06/07 PHP
php模板原理讲解
2013/11/13 PHP
PHP保存session到memcache服务器的方法
2016/01/19 PHP
PHP调用存储过程返回值不一致问题的解决方法分析
2016/04/26 PHP
JS获取计算机mac地址以及IP的实现方法
2014/01/08 Javascript
JS对象转换为Jquery对象示例
2014/01/26 Javascript
使用jQuery时Form表单元素ID和name命名大忌
2014/03/06 Javascript
关于img的href和src取变量及赋值的方法
2014/04/28 Javascript
jQuery实现的多选框多级联动插件
2014/05/02 Javascript
Javascript玩转继承(三)
2014/05/08 Javascript
JavaScript获得url所有参数键值表的方法
2015/03/21 Javascript
深入理解js promise chain
2016/05/05 Javascript
jquery插件方式实现table查询功能的简单实例
2016/06/06 Javascript
jQuery简单实现彩色云标签效果示例
2016/08/01 Javascript
webpack独立打包和缓存处理详解
2017/04/03 Javascript
vue-router单页面路由
2017/06/17 Javascript
js禁止表单重复提交
2017/08/29 Javascript
javascript帧动画(实例讲解)
2017/09/02 Javascript
关于在vue 中使用百度ueEditor编辑器的方法实例代码
2018/09/14 Javascript
详解vuex commit保存数据技巧
2018/12/25 Javascript
解决vue字符串换行问题(绝对管用)
2020/08/06 Javascript
vue使用video插件vue-video-player详解
2020/10/23 Javascript
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
Python实现的绘制三维双螺旋线图形功能示例
2018/06/23 Python
pandas每次多Sheet写入文件的方法
2018/12/10 Python
Python 实现微信防撤回功能
2019/04/29 Python
python 叠加等边三角形的绘制的实现
2019/08/14 Python
python实现密码强度校验
2020/03/18 Python
python 使用建议与技巧分享(四)
2020/08/18 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
幼儿园实习生辞职信
2014/01/20 职场文书
求职信的最佳写作思路
2014/02/01 职场文书
《狼》教学反思
2014/03/02 职场文书
餐馆开业致辞
2015/08/01 职场文书
python爬取豆瓣电影TOP250数据
2021/05/23 Python