『壹』 什麼是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