‘壹’ 什么是psr-0,psr-1,psr-2标准
转自:http://www.nginx.cn/2677.html
FIG组织在制定跟php相关规范,简称PSR,PSR旨在通过讨论我们代码项目的共同点以找出一个协作编程的方法。
什么是psr0强调自动加载的方式
下文描述了若要使用一个通用的自动加载器(autoloader),你所需要遵守的规范:
规范
一个完全标准的命名空间(namespace)和类(class)的结构是这样的:\*
每个命名空间(namespace)都必须有一个顶级的空间名(namespace)("组织名(Vendor Name)")。
每个命名空间(namespace)中可以根据需要使用任意数量的子命名空间(sub-namespace)。
从文件系统中加载源文件时,空间名(namespace)中的分隔符将被转换为 DIRECTORY_SEPARATOR。
类名(class name)中的每个下划线_都将被转换为一个DIRECTORY_SEPARATOR。下划线_在空间名(namespace)中没有什么特殊的意义。
完全标准的命名空间(namespace)和类(class)从文件系统加载源文件时将会加上.php后缀。
组织名(vendor name),空间名(namespace),类名(class name)都由大小写字母组合而成。
示例
\Doctrine\Common\IsolatedClassLoader => /path/to/project/lib/vendor/Doctrine/Common/IsolatedClassLoader.php
\Symfony\Core\Request => /path/to/project/lib/vendor/Symfony/Core/Request.php
\Zend\Acl => /path/to/project/lib/vendor/Zend/Acl.php
\Zend\Mail\Message => /path/to/project/lib/vendor/Zend/Mail/Message.php
空间名(namespace)和类名(class name)中的下划线
\namespace\package\Class_Name => /path/to/project/lib/vendor/namespace/package/Class/Name.php
\namespace\package_name\Class_Name => /path/to/project/lib/vendor/namespace/package_name/Class/Name.php
以上是我们为实现通用的自动加载而制定的租野最低标准。你可以利用能够自动加载PHP 5.3类的SplClassLoader来测答型族试你的代码是否符合这些标准。
实例
下面是一个怎样利用上述标准来实现自动加载的示例函数。
<?php
function autoload($className)
{
$className = ltrim($className, '\\');
$fileName = '';
$namespace = '';
if ($lastNsPos = strrpos($className, '\\')) {
$namespace = substr($className, 0, $lastNsPos);
$className = substr($className, $lastNsPos + 1);
$fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
}
$fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
require $fileName;
}
SplClassLoader实现清弊
下面的gist是一个按照上面建议的标准来自动加载类的SplClassLoader实例。这是依据这些标准来加载PHP 5.3类的推荐方案。
什么是psr1,定义基本代码规范
本节我们将会讨论一些基本的代码规范问题,以此作为将来讨论更高级别的代码分享和技术互用的基础。
RFC 2119中的必须(MUST),不可(MUST NOT),建议(SHOULD),不建议(SHOULD NOT),可以/可能(MAY)等关键词将在本节用来做一些解释性的描述。
1. 概述
源文件必须只使用 和 这两种标签。
源文件中php代码的编码格式必须只使用不带字节顺序标记(BOM)的UTF-8。
一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
命名空间(namespace)和类(class) 必须遵守PSR-0标准。
类名(class name) 必须使用骆驼式(StudlyCaps)写法 (译者注:驼峰式(cameCase)的一种变种,后文将直接用StudlyCaps表示)。
类(class)中的常量必须只由大写字母和下划线(_)组成。
方法名(method name) 必须使用驼峰式(cameCase)写法(译者注:后文将直接用camelCase表示)。
2. 文件
2.1. PHP标签
PHP代码必须只使用长标签()或者短输出式标签(<?= ?>);而不可使用其他标签。
2.2. 字符编码
PHP代码的编码格式必须只使用不带字节顺序标记(BOM)的UTF-8。
2.3. 副作用
一个源文件建议只用来做声明(类(class),函数(function),常量(constant)等)或者只用来做一些引起副作用的操作(例如:输出信息,修改.ini配置等),但不建议同时做这两件事。
短语副作用(side effects)的意思是 在包含文件时 所执行的逻辑与所声明的类(class),函数(function),常量(constant)等没有直接的关系。
副作用(side effects)包含但不局限于:产生输出,显式地使用require或include,连接外部服务,修改ini配置,触发错误或异常,修改全局或者静态变量,读取或修改文件等等
下面是一个既包含声明又有副作用的示例文件;即应避免的例子:
<?php
// 副作用:修改了ini配置
ini_set('error_reporting', E_ALL);
// 副作用:载入了文件
include "file.php";
// 副作用:产生了输出
echo "<html>\n";
// 声明
function foo()
{
// 函数体
}
下面是一个仅包含声明的示例文件;即应提倡的例子:
<?php
// 声明
function foo()
{
// 函数体
}
// 条件式声明不算做是副作用
if (! function_exists('bar')) {
function bar()
{
// 函数体
}
}
3. 空间名(namespace)和类名(class name)
命名空间(namespace)和类(class)必须遵守 PSR-0.
这意味着一个源文件中只能有一个类(class),并且每个类(class)至少要有一级空间名(namespace):即一个顶级的组织名(vendor name)。
类名(class name) 必须使用StudlyCaps写法。
PHP5.3之后的代码必须使用正式的命名空间(namespace) 例子:
<?php
// PHP 5.3 及之后:
namespace Vendor\Model;
class Foo
{
}
PHP5.2.x之前的代码建议用伪命名空间Vendor_作为类名(class name)的前缀
<?php
// PHP 5.2.x 及之前:
class Vendor_Model_Foo
{
}
4. 类的常量、属性和方法
术语类(class)指所有的类(class),接口(interface)和特性(trait)
4.1. 常量
类常量必须只由大写字母和下划线(_)组成。 例子:
<?php
namespace Vendor\Model;
class Foo
{
const VERSION = '1.0';
const DATE_APPROVED = '2012-06-01';
}
4.2. 属性
本指南中故意不对$StulyCaps,$camelCase或者$unser_score中的某一种风格作特别推荐,完全由读者依据个人喜好决定属性名的命名风格。
但是不管你如何定义属性名,建议在一个合理的范围内保持一致。这个范围可能是组织(vendor)级别的,包(package)级别的,类(class)级别的,或者方法(method)级别的。
4.3. 方法
方法名则必须使用camelCase()风格来声明。
什么是PSR2定义代码风格
代码风格指南
本手册是基础代码规范(PSR-1)的继承和扩展。
为了尽可能的提升阅读其他人代码时的效率,下面例举了一系列的通用规则,特别是有关于PHP代码风格的。
各个成员项目间的共性组成了这组代码规范。当开发者们在多个项目中合作时,本指南将会成为所有这些项目中共用的一组代码规范。 因此,本指南的益处不在于这些规则本身,而在于在所有项目中共用这些规则。
RFC 2119中的必须(MUST),不可(MUST NOT),建议(SHOULD),不建议(SHOULD NOT),可以/可能(MAY)等关键词将在本节用来做一些解释性的描述。
‘贰’ php自动加载实现加载不同文件夹相同类名问题
不知道你说的命名空间是不是use之后直接加载的。
命名空间在你这个问题上是最简单,最直接的解决方案。
你已经实现这个了,改下就可以了
functionautoload($dir,$file){
include_once$dir.'/'.$file.'.class.php';
}
functionload_file($dir,$file){
spl_autoload_register('autoload');
}
‘叁’ php中smarty模板中如何使用preg_match_all和preg_replace函数
Smarty2和Smarty3在实现上差不多,但是在smarty2升级到smarty3的时候还是要注意些许不同。
下面是已知的和smarty2不兼容的地方 == 语法 ==Smarty 3 API有些方面进行了更新。一些Smarty 2 API调用需要更新以便符合Smarty 3。你可能会得到提示,推荐你使用新的语法。可以查看Smarty 3附带的 README 文件获得更多信息。
{$array|@mod} 语法总是让人迷惑,加上@符号说明修饰符作用于数组而不是作用于数组的每个元素。通常你总是想让这个修饰符作用于这个变量而不必考虑它的类型。在 Smarty 3中,{$array|mod} 和 {$smary|@mod}
是等同的。去掉@符号,修饰符仍然作用于数组。如果你想修饰符作用于数据元素,你必须在模板中循环数组,或者使用自定义修饰符以支持数组遍历。
大多smrty函数已经在需要的地方例如{html_options}进行了转义。 == PHP版本 ==Smarty 3 仅支持PHP 5. 在PHP 4将不能正常工作。 == {php} 标记 ==
Smarty 3 默认关闭 {php} 标记支持,不推荐使用。你可以通过设置$smarty->allow_php_tag=true来启用。{php} 块中的变量不再与同一页中的其它{php}块共享作用域,因此在使用的时候要注意。 == 定界符和空格 ==
Smarty 定界符 {} 有空格包围是不再认为是Smarty标记。因此,{ foo } 将被Smarty忽略,但是 {foo} 将被识别。这个变化使得 Javascript/CSS更容易在smarty中使用,而没有必要使用 {literal}.
这个特性可以通过设置 $smarty->auto_literal = false; 禁用。 == 未用引号的字符串 ==
Smarty 2 对于参数中未用引号括起来的字符串有点宽容(并且模棱两可)。Smarty 3 比较严格。对于不包含特殊字符(A-Za-z0-9_之外的字符)的字符串仍然可以不用引号括起来。比如下面例子中文件名就必须用引号括起来。[xhtml]view plain{assign var=foo value=baz} <-- works ok {include file="path/foo.tpl"} <-- needs quotes! == 扩展Smarty类 ==
Smarty 3 遵循PHP5标准构造规则。扩展Smarty类的时候,使用 __construct() 作为类的构造函数的名称。如果你实现自己的构造函数,一定要先调用 parent::__construct() [php]view plainclass MySmarty extends Smarty { function __construct() { parent::__construct(); // your initialization code goes here } } == 自动加载器 ==
Smarty 用spl_autoload_register函数 实现了它自己的自动加载器。如果想在自己的应用中使用自动加载器,就必须使用此方法注册。
使用 __autoload() 将失败。 这是PHP5标准自动加载函数。可以查看
http://us3.php.net/manual/en/function.spl-autoload-register.php== 插件文件名 ==
自从Smarty 3使用默认的spl自动加载器,就要求插件文件名使用小写字母。Smarty 2 允许使用大小写混合插件名,你必须重命名以用于smarty 3. == Smarty特殊变量作用域 ==
在Smarty 2中Smarty特殊变量 $smarty.section.* and $smarty.foreach.*
拥有全局作用域。如果子模板中含有同名的循环,就会覆盖父模板中的值。在Smarty 3中这些特殊变量将只作用于定义循环所在的模板。若是需要在子模板中使用,就不得不使用参数传递。
<source lang="smarty">
{include file="path/foo.tpl" index=$smarty.section.foo.index}
</source>== SMARTY_RESOURCE_CHAR_SET ==
Smarty 3 设置常量 SMARTY_RESOURCE_CHAR_SET 为 utf-8作为模版文件的默认字符集.
只是作为像 escape 等函数的默认字符集. 如果你的模板使用其它字符集, 就必须自己定义这个常量.== trigger_error()
API 函数 trigger_error() 已被移除。 == Smarty 常量 ==
下面这些常量
SMARTY_PHP_PASSTHRU
SMARTY_PHP_QUOTE
SMARTY_PHP_REMOVE
SMARTY_PHP_ALLOW
已被类常量替代
Smarty::PHP_PASSTHRU
Smarty::PHP_QUOTE
Smarty::PHP_REMOVESmarty::PHP_ALLOW