Zend FrameWork 配置文件(初级版)

[production]
;命名空间配置以及自动命名空间注册
autoloadernamespaces[] = “Zend_”
autoloadernamespaces[] = “Paper_”
appnamespace = “Application”
;运行时设置
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
phpSettings.DATE.timezone =”Asia/Shanghai”
;zend类库目录设置
includePaths.library = APPLICATION_PATH “/../library”
;引导文件配置,其中第二句可以省略
bootstrap.path = APPLICATION_PATH “/Bootstrap.php
bootstrap.class = “Bootstrap”
;前端控制器、默认模块、模块分组配置
resources.frontcontroller.moduledirectory = APPLICATION_PATH “/modules”
resources.frontController.controllerDirectory = APPLICATION_PATH “/controllers”
resources.frontcontroller.defaultModule = “default”
;为了统一模块类名,这里需要设置默认模块前缀需要带上
resources.frontcontroller.params.prefixDefaultModule = true
;程序运行异常配置
resources.frontcontroller.throwexceptions = true
resources.frontController.params.displayExceptions = 1
;配置layout布局文件
resources.layout.layoutPath = APPLICATION_PATH “/layouts”
;数据库连接设置
resources.db.adapter = “PDO_MYSQL”
resources.db.isdefaulttableadapter = true
resources.db.params.dbname = “Joyous
resources.db.params.username = “Joyous
resources.db.params.password = “123456”
resources.db.params.host = “localhost”
resources.db.params.charset = “UTF8”

Zend_Config使用笔记

1.zend_Config被设计在应用程序中简化访问和使用配置数据。它为在应用程序代码中访问这样的配置数据提供了一个基于用户接口的嵌入式对象属性。配置数据可能来自于各种支持等级结构数据存储的媒体

// 给出一个配置数据的数组
$configArray = array(
‘webhost’ => ‘localhost’,
‘database’ => array(
‘adapter’ => ‘pdo_mysql’,
‘params’ => array(
‘host’ => ‘localhost,
‘username’ => ‘dbuser’,
‘password’ => ‘secret’,
‘dbname’ => ‘mydatabase’
)
)
);

// 基于配置数据创建面向对象
$config = new Zend_Config($configArray);

// 输出配置数据 (结果为’localhost’中)
echo $config->webhost;

// 使用配置数据来连接数据库
$db = Zend_Db::factory($config->database->adapter,
$config->database->params->toArray());

// 另外的用法:简单地传递 Zend_Config 对象。
// Zend_Db factory 知道如何翻译它。
$db = Zend_Db::factory($config->database);

PS:还可这样使用
// config.php
return array(
‘webhost’ => ‘localhost’,
‘database’ => array(
‘adapter’ => ‘pdo_mysql’,
‘params’ => array(
‘host’ => ‘localhost’,
‘username’ => ‘dbuser’,
‘password’ => ‘secret’,
‘dbname’ => ‘mydatabase’
)
)
);
然后$config = new Zend_Config(require ‘config.php’);

Continue reading

Zend_Db_Adapter使用详情

Zend_Db_Adapter是zendfrmaeword的数据库抽象层api. 基于pdo, 你可以使用 Zend_Db_Adapter 连接和处理多种 数据库,包括:microsoft SQL Server,MySql,SQLite等等.
1.连接数据库

<?php
require_once ‘Zend/Db.php’;
$params = array (‘host’ => ‘127.0.0.1’,
‘username’ => ‘root’,
‘password’ => ‘root’,
‘dbname’ => ‘zendstudy’,
charset’ => ‘utf8’)
$db = Zend_Db::factory(‘PDO_MYSQL’, $params);
?>

2.SQL语句添加引号防止攻击

第一种是quote() 方法. 该方法会根据数据库adapter为标量加上 合适的引号;假如你试图对一个数组做quote操作, 它将为数组中 每个元素加上引号,并用”,”分隔返回.
$value = $db->quote(‘St John”s Wort’);
//$value 现在变成了 ‘St John\”s Wort’
$value = $db->quote(array(‘a’, ‘b’, ‘c’));
//$value现在变成了 ‘a’, ‘b’, ‘c'(“,”分隔的字符串)
第二种是 quoteInto() 方法. 你提供一个包含问号占位符的基础字符串 , 然后在该位置加入带引号的标量或者数组. 该 方法对于随需构建查询sql语句和条件语句是很有帮助的. 使用 quoteInto处理过的标量和数组返回结果与quote() 方法相同.
$where = $db->quoteInto(‘id = ?’, 1);//id = 1
$where = $db->quoteInto(‘id IN(?)’, array(1, 2, 3));//id IN(1, 2, 3)

Continue reading

Zend FrameWork之Zend_Db_Table笔记

根据Zend_Db_Table操作数据(也就是在models建立一个对应表的模型)
准备条件:
course数据表中有cid课程号,自增,主键,cname课程名称,ccredit课程学分
在models建立Course.php编写Course类继承Zend_Db_Table
写表$_name=’course’;表主键$_primary=’cid’;
1.插入记录操作
要在表中插入一行新数据,只需要将列名:数据的关联数组作为参数,调 用insert()方法即可.(zend framework)会自动对数据进行加引号处理, 并返回插入的最后一行的id值(注意:这里不同于 zend_db_adapter::insert方法,后者返回的是插入的行数).
例子:
$cModel = new Course();
$data = array(‘cname’ => ‘网络编程’, ‘ccredit’ => ‘2’);
//cname和ccredit必须和数据表字段对应
$cModel->insert($data);//这样数据库中就会增加一条信息

2.更新数据操作
要修改表中的任意行数据,我们可以设定一个列名:数据的关联数组作为参数,调 用update()方法,同是通过一个where条件从句来决定需要改变的行.该方法将会 修改表中数据并返回被修改的行数.
条件从句不会增加引号,所以建议使Adapter编写
例子:
$cModel = new Course();
$where = $cModel->getAdapter()->quoteInto(“`cid` = ?”, 2);
$data = array(‘cname’ => ‘C语言’, ‘ccredit’ => ‘3’);
$cModel->update($data, $where);

Continue reading

init,__construct区别以及PHP魔术方法大汇总

init()是框架设置为初始化函数,当然框架内部还是用的___construct()内置函数;如果你是框架开发者,你当然也可以把初始化函数写成__init(),begin(),start()等

PS:php内部的几个魔术方法
PHP把所有以__(两个下划线)开头的类方法当成魔术方法
1)__construct()
这样的方法是构造函数,适合在使用对象前做一些初始化工作(注意:在5.3.3之后的版本与类名相同的方法不在是作为构造函数),注意在子类需要使用父类构造函数需要显示调用parent::__construct()
2)__destruct()
与构造函数对应的是这个函数,这个是析构函数,对象的所有引用都被删除或者当前对象被显示销毁才执行
如果需要调用父类析构函数也需要显式调用parent::__destruct()。注意这个析构函数即使调用exit()函数也会执行
3)__call()
如果调用了当前环境下未定义(包含没有权限访问的)和不可见属性或者方法,这个方法会调用本类__call,如果没有的话就会调用父类的__call方法
4)__callStatic()
5.3.0新增方法,主要用于静态方法中,同样的,这个方法必须使用public修饰
5)__get()
读取未定义变量会调用该方法
6)__set()
5.1.0之后增加,未定义变量赋值会调用该方法
7)__isset()
当对未定义变量调用isset()或者empty()时调用该方法
8)__unset()
对未定义变量调用unset(),该魔术方法才会生效
9)__sleep()
serialize() 检查类中是否有魔术名称__sleep 的函数。如果这样,该函数将在任何序列化之前运行。它可以清除对象并应该返回一个包含有该对象中应被序列化的所有变量名的数组。使用__sleep 的目的是关闭对象可能具有的任何数据库连接,提交等待中的数据或进行类似的清除任务。此外,如果有非常大的对象而并不需要完全储存下来时此函数也很有用。
10)__wakeup()
unserialize() 检查具有魔术名称 __wakeup 的函数的存在。如果存在,此函数可以重建对象可能具有的任何资源。使用 __wakeup 的目的是重建在序列化中可能丢失的任何数据库连接以及处理其它重新初始化的任务。
11)__toString()
__toString方法在将一个对象转化成字符串时自动调用
PHP 5.2.0之前,__toString方法只有结合使用echo() 或 print()时 才能生效。PHP 5.2.0之后,则可以在任何字符串环境生效(例如通过printf(),使用%s修饰符),但 不能用于非字符串环境(如使用%d修饰符)。从PHP 5.2.0,如果将一个未定义__toString方法的对象 转换为字符串,会报出一个E_RECOVERABLE_ERROR错误
12)__invoke()
当尝试以调用函数的方式调用一个对象时,__invoke() 方法会被自动调用,注意只能在5.3.0以后才能使用
13)__set_state()
当调用 var_export()时,这个静态 方法会被调用(自PHP 5.1.0起有效)。
14)__clone()
当复制完成时, 如果定义了__clone()方法, 则新创建的对象(复制生成的对象)中的__clone()方法会被调用, 可用于修改属性的值(如果有必要的话)。因为php对象赋值使用的引用传递,新对象会更改原对象的属性和方法

zendframework中render,forward,redirect区别

1.render
$this->render(‘my’);//注意没有.phtml
这样会在当前控制器下的my.phtml(也就是views/scripts/当前控制器文件夹/my.phtml)
只能读取本控制器文件夹下视图
2.forward
$this->_forward(‘my’,’index’,’admin’);
这样就是admin模块下index控制器下的my方法
$this->_forward(‘my’,’index’);
这样会访问当前模块下index控制器下的my方法,而且这样使用之后,本方法没有视图也不会报错!
$this->_forward(‘my’);
这样会访问当前模块下,当前控制器下的my方法
$params=array(‘a’=>1,’b’=>2);
$this->_forward(‘my’,’index’,’admin’,$params);
这样就是/admin/index/my/a/1/b/2(这样适合传递参数使用)
这个不能跳出本站点之外
3.redirect
$this->_redirect();可以在本站点任意转向,也可以直接跳转到本站点之外的站

zendframework学习笔记(初级版)

1.项目目录结构分析

application存放相关组件
application/configs配置文件
application/controllers控制器
application/models模型的文件夹
application/views存放视图文件
docs项目相关文档,帮助手册等
librarty存放zend类库
public存放可以公开的图片,js,css等

2.环境要求

开启rewrite模块以及支持识别.htaccess(配置apache)
开启pdo以及相关引擎支持(配置php
PHP版本5.2.0以上版本

3.控制器中常见方法
$this->render(‘additem’);
这个方法是调用视图的时候使用的,比如控制器方法是additemtest而试图是additem.phtml
那么就可以使用$this->render(‘additem’);如果没有这一句话,那么就会调用对应试图文件夹下的additemtest.phtml

$this->getRequest()->getParam(‘id’,’默认值’);
这个方法可以接收get方法传递的id属性的值,等同于$_GET[‘id’]
$this->_request->getParam(‘name’);
这个方法可以接收到get方法传递的name属性的值,等同于$_GET[‘name’];(这里也可以得到post的值)

建议使用$this->_request->getPost(‘username’);来代替$_POST[‘username’]

4.手册【zf手册

ZendFrameWork组件Layout学习笔记

试图助手可以理解成为控制页面布局,按照这个顺序进行页面的渲染

$this->headLink()

只是生成link标记占位符,例如
<?php echo $this->headLink()->appendStylesheet(‘/css/global.css’) ?>这样就会生成如下代码
<link href=”/css/global.css” media=”screen” rel=”stylesheet” type=”text/css” >
注意了,如果你使用如下代码:
<?php echo $this->headLink()->appendStylesheet(‘/css/global.css’) ?>
<?php echo $this->headLink()?>
这样就会在页面生成
<link href=”/css/global.css” media=”screen” rel=”stylesheet” type=”text/css” >这个代码两次!!(先记下来)
加载css当然也可以这样写
<link href=”<?php echo $this->baseUrl();?>/admin/css/reset.css” rel=”stylesheet” type=”text/css” />

这里又多了一个$this->baseUrl()
这个在新版本中(大概在1.9之后吧,才能直接使用!不然自己定义)
代表的就是public目录在网站根目录位置
比如:/notebook/public

当然$this->headScript()用法就类似headLink()不再说了
还有就是$this->headTitle()函数了,这个用法呢,可以在启动文件
$view->headTitle()->setSeparator(‘-‘);//这个就是设置的固定内容和页面title的分割符号
$view->headTitle(‘固定内容’);//设置固定内容
这样在控制器里面
$this->view->headTitle(‘页面标题’, ‘APPEND’);
这样会再生成页面中
<title>后面固定-页面标题</title>
$this->view->headTitle(‘页面标题’, ‘PREPEND’);会成
<title>页面标题-后面固定</title>
需要用共用的顶部和底部文件
那么可以在页面文件夹(application/layouts/scripts),当然你可以在配置文件中配置
resources.layout.layoutPath = APPLICATION_PATH “/layouts/scripts”
这样在application/layouts/scripts下建立一个head.phtml/foot.phtml/default.phtml
default.phtml
内容如下:
<?php echo $this->render(‘head.phtml’);?>
<?php echo $this->layout()->content;?>
<?php echo $this->render(‘foot.phtml’);?>
这里只解释下render函数,就有点类似smarty中的display,就是渲染页面,而这里的render函数也可读取到application/layouts/scripts,如果需要设置不同文件夹进行分类,就带上目录即可
head.phtml内容如下:
<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”>
<html xmlns=”http://www.w3.org/1999/xhtml”>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
<?php echo $this->headTitle();?>
<link href=”<?php echo $this->baseUrl();?>/admin/css/reset.css” rel=”stylesheet” type=”text/css” />
<?php echo $this->headLink()->appendStylesheet(‘/css/global.css’) ?>
<?php echo $this->headLink()?>
<script language=”javascript” type=”text/javascript” src=”<?php echo $this->baseUrl();?>/scripts/jquery-1.7-min.js”></script>
<?php echo $this->headScript();?>
</head>
<body>
这是共用的顶部文件
<br>

foot.phtml页面内容如下:
这是底部文件
</body>
</html>

而views目录下的scripts目录下index目录下的index.phtml内容如下:
这是页面内容
<br>

这个时候需要制定index模块下的布局按照default.phtml布局
在初始化的时候加上:
$this->_helper->layout->setLayout(‘default’);//注意不要加后缀
这样访问index下的所有方法都是按照这个布局显示

如果分组呢?
提示一下setLayout函数可以读取application/layouts/scripts这个目录
那你就可一将不同的页面分开放置了!

如果这个模块下的一个方法比较独立,那么需要单独布局页面,在方法中加上
$this->_helper->layout()->disableLayout();//即可屏蔽掉页面布局

如果有的模块只是作为中间页面,任何输出都没有的页面需要屏蔽掉渲染可以在方法中加上
$this->_helper->viewRenderer->setNoRender();这样就不需要建立对应的试图文件

添加关键词以及设置网站描述,在控制器方法中添加
$this->view->headMeta ()->appendName ( ‘keywords’, ‘关键词’ );
$this->view->headMeta ()->appendName ( ‘description’, ‘网站描述’ );
然后在视图中就可以使用
<?php echo $this->headMeta();?>
显示关键词以及网站描述

Zend FrameWork程序员来看看

1.php文件格式

只有php代码的文件结尾不允许出现?>结束

缩进要用4个空格而不是用tab

每行代码长度在80~120字符

2.命名约定

类名只允许使用数字字母字符(不建议使用数字),eg;Zend/Db/Table.php中类名字就是Zend_Db_Table。也就是说下划线代表目录

函数名首字母必须小写,而且尽量能说明函数的意思,多个字母的话之间除首个单词外的其他单词首字母大写

在对象中方法如果声明为protected或者private名称首字符必须用下划线开头

变量如果声明成private或者protected那么也要用下划线开头

常量必须全部用大写,所有单词之间必须用下划线隔开

3.编码风格

不允许使用短标签

字符串应该用单引号扩起来,如果内部用单引号那么需要用双引号扩住全部

变量替换尽量使用一种(”hello $name”;或者“hello {$name};”)

字符串连接必须用点(.),在前后都要用空格提高可读性

数组元素中每个逗号和下个元素要用空格隔开

类的花括号要在类名的下一行开始,类中所有代码必须用4个空格缩进

函数的参数用逗号和空格分开,函数名与括号之间没有空格

if和后面的条件要用空格隔开,操作符和操作数或者变量用空格隔开

注释要有文件注释以及类注释和函数注释,函数注释需要有函数描述以及参数还有就是函数所有可能的返回值