zend学习笔记.docx
《zend学习笔记.docx》由会员分享,可在线阅读,更多相关《zend学习笔记.docx(15页珍藏版)》请在冰豆网上搜索。
![zend学习笔记.docx](https://file1.bdocx.com/fileroot1/2022-11/25/11f1beef-d43d-4001-8a6d-1620d296731d/11f1beef-d43d-4001-8a6d-1620d296731d1.gif)
zend学习笔记
路由规则:
路由是一个过程,在这个过程中它去除URI的端点(跟着基本URL的URI部分),并将其分解成参数来决定哪个模块、哪个控制器和哪个动作应该接受请求。
模块、控制器、动作、及其参数被打包到Zend_Controller_Request_Http对象。
使用路由器
为了正确使用路由器,必须对其进行初始化操作。
创建路由器可以通过前端控制器实例的getRouter()方法来实现。
该方法不需要任何参数,执行该方法可以返回一个
Zend_Controller_Router_Rewrite对象。
创建路由器之后,需要添加一些用户定义的路由,该操作可以通过Zend_Controller_Router_Rewrite对象的addRoute()方法来实现。
代码:
php
/**
演示创建路由器的过程
*/
require_once'Zend/Controller/Front.php';
//引用Zend_Controller_Front.php
$ctrl=Zend_Controller_Front:
:
getInstance();
//创建一个前端控制器
$router=$ctrl->getRouter();
//返回一个默认路由,前端控制器功能很强大啊
$router->addRoute('user',newZend_Controller_Router_Route('user/:
username',array('controller'=>'user','action'=>'info')));
4种基本路由
1.缺省路由
定义:
缺省路由是存储在RewriteRouter中名为‘default’的简单Zend_Controller_Router_Route_Module对象。
2.标准框架路由
定义:
Zend_Controller_Router_Route是标准的框架路由。
php
//定义标准框架路由
$route=newZend_Controller_Router_Route('author/:
username',
array(
'controller'=>'profile',
'action'=>'userinfo'
));
//向路由器中添加定义的路由
$router->addRoute('user',$route);
3.静态路由
定义:
特定的路由被设定成型Zend_Controller_Router_Route_Static。
php
//定义静态路由
$route=newZend_Controller_Router_Route_Static(
'login',
array(
'controller'=>'auth',
'action'=>'login'
));
//向路由器中添加定义的路由
$router->addRoute('login',$route);
4.正则表达式路由
Zend_Controller_Router_Route_Regex
php
//正则表达式路由
$route=newZend_Controller_Router_Route_Regex(
'archive/(\d+)',
array(
'controller'=>'archive',
'action'=>'show'
));
//向路由器中添加定义的路由
$router->addRoute('archive',$route);
页面头部的设置
Html:
Php:
header("Content-type:
text/html;charset=utf-8");
Zendframework跳转试图重定向的三种方法。
zendframework重定向的方法有三种。
render,forward,redirect。
1.render是用来调视图用的,不会调用ACTION内部代码
1$this->render('upload');
这句话的意思是{当前Module}/{当前Controller(action)}/upload.phtml
2.forward的写法比较灵活。
2$this->_forward('upload');
这句话的意思是{当前Module}/{当前Controller}/upload
3$this->_forward('upload','index');
这句话的意思是{当前Module}/index/upload
4$this->_forward('upload','index','admin');
这句话的意思是admin/index/upload
forward还可以传参
[php]viewplain
5$params=array(
6'a'=>'1',
7'b'=>'2'
8);
9$this->_forward('upload','index','admin',$params);
这句话的意思是admin/index/upload/a/1/b/2
3.redirect写法比较简单,方法中填写跳转路径就行了,要从module开始写。
10$this->_redirect('/admin');
这句话的意思是/admin
$this->_redirect('/admin/index');
这句话的意思是/admin/index
11$this->_redirect('/admin/index/upload');
这句话的意思是/admin/index/upload
如果redirect想要传参怎么办呢?
那就只能也写在链接里了。
如下
12$this->_redirect('/admin/index/upload/a/1/b/2');
这句话的意思是/admin/index/upload/a/1/b/2
Zend路径问题
D:
\Zend\my120\publicdirname(__FILE__)//打印文件路径
D:
\Zend\my120\public/../storagedirname(__FILE__).'/../storage';//打印连接后的文件路径
D:
\Zend\my120\applicationrealpath(dirname(__FILE__).'/../application');//打印经过转换的文件路径
首先
我们来看这个全局变量:
__FILE__
它表示文件的完整路径(当然包括文件名在内)
也就是说它根据你文件所在的目录不同,有着不同的值;当然,当它用在包行文件中的时候,它的值是包含的路径;
然后:
我们看这个函数:
stringdirname(stringpath)
它是PHP内置函数,它的作用是什么呢,就是返回除了本文件名以外的所在目录,给你举个例子
假如你的首页中用到了_FILE_这个变量:
(假设你的网页所在目录为:
http:
//localhost/web/index.php),那么:
_FILE_的值为http:
//localhost/web/index.php(一个绝对路径)。
而此时dirname(_FILE_)表示的就是http:
//localhost/web/也就是没有index.php这个文件名。
而dirname(dirname(_FILE_))表示的就是上一级的目录,以此类推;
最后
看一下define()这个函数,其实他就是一个定义常量的函数,比如:
define('MEN','ooooo');
那么你后你就可以用MEN来表示ooooo这个字符串;
如果你学过C语言,你就很清楚,其中也有一个类似的#defineMEN"ooooo";(其实应该说哦php和C类似,因为php就是c编写的);
那么这么写有什么好处呢,那就是当你需要修改变量的时候,你只要修改它就行了,相当的方便,尤其是像路径这样的字符串!
酒后给你解释一下你这段代码:
define('__TYPECHO_ROOT_DIR__',dirname(__FILE__));
就是定义__TYPECHO_ROOT_DIR__为这个文件所在的目录,像这种定义一般是放在config.inc.php中的,那么获取的目录也就是config.inc.php所在的目录;也就是根目录!
define('__TYPECHO_PLUGIN_DIR__','/usr/plugins');这就不要我说了吧!
至于set_include_path(get_include_path().PATH_SEPARATOR.$path);是什么意思,我想没有你想得那么复杂:
他就是包含路径;
比如你有一个文件夹:
命名为include,里面有
数据库连接文件:
conn.php……,
你这样设置:
set_include_path("/include")
那么以后你就直接可以在其他页面中使用
include("conn.php")
这不是经常见到吗?
它参数就字符串,当然你也可以设置多个路径,中间用;分开,
而你那句:
set_include_path(get_include_path().PATH_SEPARATOR.
__TYPECHO_ROOT_DIR__.'/var'.PATH_SEPARATOR.
__TYPECHO_ROOT_DIR__.__TYPECHO_PLUGIN_DIR__);
什意思呢,举个例子:
你的一个页面有这样的语句:
include('/inc/sql.php');
include('/inc/conn.php');
;
;
而你突然发现我把这些要包含的文件放在inc目录下不安全,怎么办,要改,我想放到include目录中,好的,这么多页面不累死才怪:
有没有好的方法!
有!
!
!
!
!
!
!
我在config.inc.php中写着么一句:
set_include_path(get_include_path().'/include')就这么简单,对,就这么简单!
动态的修改!
你不要看这个:
get_include_path().PATH_SEPARATOR.$path这是什么,他就一路径字符串,中间的.是字符串连接符号,也就是你刚才定义的那些常量的组合,组合成一字符串,我想你一定时认为是没见过的参数!
一个很简单的函数,没什么多的解释!
也好就是说他可以动态的设置包含路径!
如果正确返回包含路径,不正确返回false;
php类中双冒号的应用及和->的区别
classTest{
publicstatic$var1=“staticvariable1";
public$var2="objectproperty2";
publicfunctiona(){echo"methoda";}
publicstaticfunctionb(){echo"staticmethodb";}
}
类里的静态属性和function调用时是不需要先declare的,直接用双冒号
echoTest:
:
var1;
Test:
:
b();
非静态的必须要在类被declare的情况下才能被引用,是用->
$o_test=newTest;
echo$o_test->var2;
$o_test->a();
就是为了区分对象的方法和属性,和是访问类的静态方法和静态变量,类的静态方法和静态变量是类公用的,不需要实例化也能访问,而对象的方法和属性是每个对象特有的,因此必须先实例化。
其他语言如C++,JAVA等也是一样的(当然它们提供的访问符号可能不一样)
双冒号一般是用在静态方法、静态变量的调用,此时类不需要实例化。
而是用箭头操作符->时,必须要将类进行实例化(或者在类的内部调用也可以。
)
双冒号(:
:
)是位置访问符号。
并不仅仅是指静态方法和变量。
而是意味着调用冒号得左边这一坨调用冒号的右边这一坨。
这样一个含义。
so。
。
左边不能写$self。
因为$self先解析,除非前面就定义了$self这个变量是指向自己的。
在php最新版本中。
双冒号就是完全遵循这个作用得用法了。
。
可以取代->调用对象得变量。
因为是位置指示符嘛。
。
->是访问对象的方法和属性,:
:
是访问类的静态方法和静态变量
绝对路径和相对路径
在HTML里只要涉及文件的地方(如超级链接、图片等)就会涉及绝对路径与相对路径的概念。
1.绝对路径
绝对路径是指文件在硬盘上真正存在的路径。
例如“bg.jpg”这个图片是存放在硬盘的“E:
\book\网页布局代码\第2章”目录下,那么“bg.jpg”这个图片的绝对路径就是“E:
\book\网页布\代码\第2章\bg.jpg"。
那么如果要使用绝对路径指定网页的背景图片就应该使用以下语句:
\book\网页布局\代码\第2章\bg.jpg">
2.使用绝对路径的缺点
事实上,在网页编程时,很少会使用绝对路径,如果使用“E:
\book\网页布\代码\第2章\bg.jpg”来指定背景图片的位置,在自己的计算机上浏览可能会一切正常,但是上传到Web服务器上浏览就很有可能不会显示图片了。
因为上传到Web服务器上时,可能整个网站并没有放在Web服务器的E盘,有可能是D盘或H盘。
即使放在Web服务器的E盘里,Web服务器的E盘里也不一定会存在“E:
\book\网页布局\代码\第2章”这个目录,因此在浏览网页时是不会显示图片的。
3.相对路径
为了避免这种隋况发生,通常在网页里指定文件时,都会选择使用相对路径。
所谓相对路径,就是相对于自己的目标文件位置。
例如上面的例子,“s1.htm”文件里引用了“bg.jpg”图片,由于“bg.jpg”图片相对于“s1.htm”来说,是在同一个目录的,那么要在“s1.htm”文件里使用以下代码后,只要这两个文件的相对位置没有变(也就是说还是在同一个目录内),那么无论上传到Web服务器的哪个位置,在浏览器里都能正确地显示图片。
再举一个例子,假设“s1.htm”文件所在目录为“E:
\book\网页布局\代码\第2章”,而“bg.jpg”图片所在目录为“E:
\book\网页布局\代码\第2章\img”,那么“bg.jpg”图片相对于“s1.htm”文件来说,是在其所在目录的“img”子目录里,则引用图片的语句应该为:
注意:
相对路径使用“/”字符作为目录的分隔字符,而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。
由于“img”目录是“第2章”目录下的子目录,因此在“img”前不用再加上“/”字符。
在相对路径里常使用“../”来表示上一级目录。
如果有多个上一级目录,可以使用多个“../”,例如““s1.htm”文件所在目录为“E:
\book\网页布局\代码\第2章”,而“bg.jpg”图片所在目录为“E:
\book\网页布局\代码”,那么“bg.jpg”图片相对于“s1.htm”文件来说,是在其所在目录的上级目录里,则引用图片的语句应该为:
再举一个例子,假设“s1.htm”文件所在目录为“E:
\book\网页布局\代码\第2章”,而“bg.jpg”图片所在目录为“E:
\book\网页布局\代码\img”,那么“bg.jpg”图片相对于“s1.htm”文件来说,是在其所在目录的上级目录里的“img”子目录里,则引用图片的语句应该为:
4.相对虚拟目录
有关相对路径还有一个比较特殊的表示:
“相对虚拟目录”。
请看下面的例子:
在这个例子里,background属性的值为“/img/bg.jpg”,注意在“img”前有一个“/”字符。
这个“/”代表的是虚拟目录的根目录.假设把“E:
\book\网页布局\代码”设为虚拟目录,那么“/img/bg.jpg”的真实路径为“E:
\book\网页布局\代码\img\bg.jpg”;如果把“E:
\book\网页布局\代码\第2章”设为虚拟目录,那么“/img/bg.jpg”的真实路径为“E:
\book\网页布局\代码\第2章\img\bg.jpg”
Zend中model的使用
接下来讲讲Zend中的model。
其实Zend中的Model处理是相当简单的。
这主要得益于autoload功能。
不像其它框架,为model定义复杂的基类。
如果要定义model,不得不要继承一个model的基类,才可以使用具体的功能。
Zend中并没有对模型进行封装。
原因大概是Model主要是和具体业务逻辑相关的,进行过多的封装,只会画蛇添足。
Zend使用了autoload和namespace功能,很委婉的解决了这个问题。
php的public、protected、private三种访问控制模式的区别
public:
公有类型
在子类中可以通过self:
:
var调用public方法或属性,parent:
:
method调用父类方法
在实例中可以能过$obj->var来调用 public类型的方法或属性
protected:
受保护类型在子类中可以通过self:
:
var调用protected方法或属性,parent:
:
method调用父类方法
在实例中不能通过$obj->var来调用protected类型的方法或属性
private:
私有类型该类型的属性或方法只能在该类中使用,在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法
2.self和 parent的区别
a).在子类中常用到这两个对像。
他们的主要区别在于self可以调用父类中的公有或受保护的属性,但parent不可以调用
b).self:
:
它表示当前类的静态成员(方法和属性) 与$this 不同,$this是指当前对像
public表示全局,类内部外部子类都可以访问;
private表示私有的,只有本类内部可以使用;
protected表示受保护的,只有本类或子类或父类中可以访问;
//父类
classfather{
publicfunctiona(){
echo"functiona";
}
privatefunctionb(){
echo"functionb";
}
protectedfunctionc(){
echo"functionc";
}
}
//子类
classchildextendsfather{
functiond(){
parent:
:
a();//调用父类的a方法
}
functione(){
parent:
:
c();//调用父类的c方法
}
functionf(){
parent:
:
b();//调用父类的b方法
}
}
$father=newfather();
$father->a();
$father->b();//显示错误外部无法调用私有的方法Calltoprotectedmethodfather:
:
b()
$father->c();//显示错误外部无法调用受保护的方法Calltoprivatemethodfather:
:
c()
$chlid=newchild();
$chlid->d();
$chlid->e();
$chlid->f();//显示错误无法调用父类private的方法Calltoprivatemethodfather:
:
b()
?
>
构造函数
void__construct([mixed$args[,$...]])[2]
PHP5允行开发者在一个类中定义一个方法作为构造函数。
具有构造函数的类会在每次创建对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
注意:
如果子类中定义了构造函数则不会暗中调用其父类的构造函数。
要执行父类的构造函数,需要在子类的构造函数中调用parent:
:
__construct()。
使用新标准的构造函数:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
php
classBaseClass{
function__construct(){
print"InBaseClassconstructor\n";
}
}
classSubClassextendsBaseClass{
function__construct(){
parent:
:
__construct();
print"InSubClassconstructor\n";
}
}
$obj=newBaseClass();
$obj=newSubClass();
?
>
为了实现向后兼容性,如果PHP5在类中找不到__construct()函数,它就会尝试寻找旧式的构造函数,也就是和类同名的函数。
因此唯一会产生兼容性问题的情况是:
类中已有一个名为__construct()的方法,但它却又不是构造函数。
__FILE__,__CLASS__等魔术变量,及实例
1,__FILE__
文件的完整路径和文件名。
如果用在被包含文件中,则返回被包含的文件名。
自PHP4.0.2起,__FILE__总是包含一个绝对路径(如果是符号连接,则是解析后的绝对路径),而在此之前的版本有时会包含一个相对路径。
这个变量,我用的是最多的,估计也是大家用的最多的。
web服务器都会指定一个documentroot的,但是不同的服务器,设置的documentroot有可能是不同的,在这种情况下,把一个网站从一个服务器搬家到另一个服务器,这样就有可能因为路径的不同,造成网站跑不起来。
php
/**
在你的公用的配置文件中,来设置你的根目录,这样就不用担心经常搬家了。
*/
define('ROOT_PATH',dirname(__FILE__).DIRECTORY_SEPARATOR);
echoROOT_PATH;
echo"
";
echo__FILE__;
echo"
";
echodirname(__FILE__);
echo"
";
echodirname(dirname(__FILE__));
?
>
2,__LINE__
文件中的当前行号。
这个变量在调试错误的时候,还是比较有作用的,其他的时候,没什