今天看啥
热点:

最近看了看laruence的yaf,相信做PHP都知道yaf(Yet another framework),觉得很不错。作为第一个用C实现的PHP MVC框架,导致无数PHPer崇拜。
将yaf的官方文档,通读了一遍,也动手实验了几把,感觉很不错,让人不得不佩服。虽然目前还没有将yaf运用到生产环境,但相信以后会用得上。

官方文档:http://yaf.laruence.com/manual/ 

 

YAF命名规则

 

YAF 命名规则默认采用的是驼峰命名法

范例:

1、控制器:controller/Hello.php

 

class HelloController extends Yaf_Controller_Abstract
{
	public function indexAction()
	{
		$this->getView()->assign("say", 'Hello world!');
	}

	public function nameAction()
	{
		$this->getView()->assign('name', 'yaf');
	}
}

我可以看到:

 

类名:文件名+Controller,采用驼峰命名法,首字母大写

方法名:动作名+Action,采用驼峰命名法,动作名首字母小写

2、视图文件

 

public function indexAction()
{
	$this->getView()->assign("say", 'Hello world!');
}

index 方法,默认会把 变量 say 值分配给 视图文件 views/hello/index.phtml

 

 

public function nameAction()
{
	$this->getView()->assign('name', 'yaf');
}

name 方法,默认把变量 name 分配给视图文件 views/hello/name.phtml

 

我们可以看到,视图文件都放在以类名(小写)为目录的文件夹中,不同方法对用不同视图文件。

 

下面说下一些通用的规则:

结合yaf的代码命名规范及PEAR命名规范,我要严格控制一下代码的命名规范(事实上早就应该重视起来),看起来专业点儿。

1.通用规则

所有文件及文件夹命名都采用小写(yaf要求mvc中的model,controller,plugin等类文件有另外的规范除外),多个单词以下划线做分隔,命名时采用标准的英文(英文简写),不采用拼写与英文的混合

2.类的命名

类名由多个单词组成(yaf要求mvc中的model,controller,plugin等类名有另外的规范除外),每个单词的首字母大写,单词之间用下划线连接,应注意类与父目录之间的关系, 通常“目录名_类名”, 目录首字母和类首字母大写

3.方法或者函数命名

多个单词组成,除第一个单词除外其余单词首字母大写( 驼峰命名 )

4. 变量命名

全小写字母,单词用下划线分割(非驼峰)

上面的内容好像太少了,找到:

http://pear.php.net/manual/en/standards.php

理解一下消化一下:

1.缩进及行的长度

缩进4个空格,而不是tab(有些编辑器可以配置一个tab代表多个空格,注意是空格);每行保持大约75-85个字符的长度

2.控制结构

这个部分最容易忽略,也是影响代码美感最重要的方面,例子很详细了,受益匪浅。

[php] 

<?php 

if ((condition1) || (condition2)) { 

    action1; 

} elseif ((condition3) && (condition4)) { 

    action2; 

} else { 

    defaultaction; 

?> 

 

[php] 

<?php 

switch (condition) { 

case 1: 

    action1; 

    break; 

  

case 2: 

    action2; 

    break; 

10 

  

11 

default: 

12 

    defaultaction; 

13 

    break; 

14 

15 

?> 

 

[php] 

<?php 

  

if (($condition1 

    || $condition2) 

    && $condition3 

    && $condition4 

) { 

    //code here 

10 

?> 

 

[php]

<?php 

  

$a = $condition1 && $condition2 

    ? $foo : $bar; 

  

$b = $condition3 && $condition4 

    ? $foo_man_this_is_too_long_what_should_i_do 

    : $bar; 

?> 

 

3.函数调用

[php] 

<?php 

$var = foo($bar, $baz, $quux); 

$short         = foo($bar); 

$long_variable = foo($baz); 

?> 

 

4.类名规范

[php

<?php 

class Foo_Bar 

  

    //... code goes here 

  

?> 

 

5.方法名规范(驼峰命名 )

[php] 

<?php 

function fooFunction($arg1, $arg2 = '') 

    if (condition) { 

        statement; 

    } 

    return $val; 

?> 

 

6.Arrays定义规范

[php] 

<?php 

  

$some_array = array( 

    'foo'  => 'bar', 

    'spam' => 'ham', 

); 

?> 

7.注释

http://pear.php.net/manual/en/standards.sample.php

http://pear.php.net/manual/en/standards.header.php

8.Including Code

任何时候都应该采用include_once或者require_once

require_once ‘foo.php’

9.PHP Code Tags

1

<?php ?>

10.全局变量及函数的命名

如果你的包需要定义全局变量,他们的名字应该开始以一个单下划线紧随其后的是包名和另一个下划线。例如,PEAR包使用一个全局变量名为 $_PEAR_destructor_object_list;全局函数采用驼峰命名,同时为了避免命名冲突,应该为全局函数加上包名紧接着一个下划线作为全局函数命名的前缀

11.类属性

全小写字母,单词用下划线分割,注意受保护和私有的属性以下划线开始

12.常量

常量单词全部大写,多个单词用下划线分隔,注意以包名作为常量的前缀可以避免命名冲突

13.文件格式

采用utf-8文件编码,以LF(换行符)作为每行的结束,在PHP的关闭标签?>之后应该还有一个LF

14.错误级别设置

E_ALL | E_STRICT

15.异常处理

http://pear.php.net/manual/en/standards.errors.php

16.PEAR2新增规则

http://pear.php.net/manual/en/pear2cs.rules.php

 

 

YAF框架的入门读书笔记和常见问题解决方法总结

 

Yaf是一个C语言编写的PHP框架,以php扩展的形式. 是 laruence(鸟哥) 的作品

 

laruence 是PHP 开发组成员, PECL 开发者. Yaf, Taint等Pecl扩展作者.

 

Yaf 相关文章 http://www.laruence.com/tag/yaf 在线手册

 

在线手册系统完整的阐述了Yaf的一切,这里作为学习导读,列出Yaf的默认行为(契约)

 

0.Yaf 配置文件(php.ini风格)

其实分两部分,一个是php.ini中的配置 "yaf." 开头,这部分通常是不用调整的。

另一部分是Yaf_Application初始化时刻的配置 "application." 开头

 

配置可以引入php常量定义

 

1.Yaf 的必须配置,其实就是个目录设定来源帮客之家

Ini代码 复制代码 收藏代码
  1. yaf.directory=APP_PATH
  2. application.directory=APP_PATH

也就是 appliction 脚本目录,至少要定义一个,application.directory优先

 

2.Yaf 有一套完整的目录组织,文件命名规则

所有Yaf应用都应该遵循下面的目录组织结构

Text代码 复制代码 收藏代码
  1. - index.php //入口文件
  2. - .htaccess //重写规则
  3. + conf
  4. |- application.ini //配置文件
  5. application/
  6. + controllers
  7. - Index.php //默认控制器
  8. + views
  9. |+ index //控制器
  10. - index.phtml //默认视图
  11. + modules //其他模块
  12. - library
  13. - models //model目录
  14. - plugins //插件目录

Yaf支持大小写敏感和不敏感两种方式,但是我没有找到大小写敏感的用法(linux环境)
类命名和搜索规则
类名称 对应目录
ClassModel models
ClassPlugin plugins
ClassController controllers
其他 library

 

3.Yaf 是通过以包含分隔符"_"的类名称配合目录组织,和完整的类命名规则完成类加载管理

比如以前你有一个Bar类文件Bar.php,如果用到Yaf里,并自动加载,那么就要这样组织

把Bar.php放到library目录下的一个子目录里面,比如 myclass

并且要更改Bar.php里面的类名(一般都是Bar的)为MyClass_Bar

也就是说类名必须包含目录名 具体解释

 

4.错误处理

Yaf里面错误处理可以通过一个控制器完成,声明在 APP_PATH/controllers/Error.php 里

Php代码 复制代码 收藏代码
  1. class ErrorController extends Yaf_Controller_Abstract {...}

当然错误控制器是否生效受配置影响来源帮客之家

Text代码 复制代码 收藏代码
  1. application.dispatcher.throwException=1
  2. application.dispatcher.catchException=1

具体看 官方提供的例子

 

5.视图view

render视图需要指定视图模板文件,可以用相对(application/views)路径或者绝对路径

 

6.路由

Yaf提供了多种级别的路径支持,正则路由也有支持,你可以用配置文件写路由,或者在Bootstrap.php里面用php脚本写路由

 

个人认为Yaf最吸引人的地方是:来源帮客之家

PHP Framework in PHP extension,如果没有数据库访问的瓶颈造成的木桶效应,Yaf这种形式是最优的

使用Yaf后在某种级别的应用中内存占用应该降低很多

 

7.BUG?发现如下问题,不知道是否是bug [product]默认匹配设置

Yaf在匹配配置文件的节(section)的时候,不是对名称完全匹配,比如配置里面有

Ini代码 复制代码 收藏代码
  1. [product]
  2. ...
Php代码 复制代码 收藏代码
  1. new Yaf_Application("conf/app.ini",'p')//如果没有p,[product] 依然有效<span style="font-size: small;"> </span>

8.MVC

Yaf和大多数框架一样提供了一个默认的MVC行为,对于M(setDefaultModule)我没有找到更改生效的方法。
C和V是一一对应的,当然可以名称不同,可以通过Yaf_Dispatcher的setView方法进行设置。

 

9.单例模式类,Yaf中

Yaf_Application
Yaf_Loader
Yaf_Dispatcher
Yaf_Registry
Yaf_Session
类实例
是单例,其他不是
需要注意如果在Yaf_Controller_Abstract继承类action中使用了forward,那将会产生新的实例对象。

 

10.非嵌套Dispatcher(2.x版本以下)

Yaf对请求的处理是非嵌套的,这意味着所有对 Controller转移都是非嵌套的,如果一个Controller没有执行完,发生了转移,那有可能发生不可知的结果甚至错误,Yaf提供的 forward是等待当前Controller执行完毕才处理的,因此如果完全按照MVC的方式对请求进行处理,要达到嵌套处理的效果,需要自己实现代码.流程对应说明。来源帮客之家

Text代码 复制代码 收藏代码
  1. mainloopstart
  2. dispatchLoopStartup
  3. preDispatch//其实是个循环受forward控制
  4. 这之间request不能发送改变,可以forward但是会被延期执行
  5. postDispatch
  6. forward的request延期执行,循环到preDispatch
  7. dispatchLoopShutdown
  8. 可以dispatch一个新的request,会开始新的dispatchLoopStartup
  9. mainloopend

评论暂时关闭