日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

PHP的PSR规范

發布時間:2024/9/19 php 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP的PSR规范 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

什么是PSR?

PSR是PHP Standards Recommendation的簡稱,這個是php-fig組織制定的一套規范。至今,php-fig已經發布了五個規范:

  • PSR-0:自動加載標準,2014-10-21該標準已經被廢棄,使用PSR-4替代,不再細講
  • PSR-1:基本的編碼風格
  • PSR-2:編碼風格(更嚴格)
  • PSR-3:日志記錄器接口
  • PSR-4:自動加載

PSR-1

PHP標簽:
PHP代碼必須放在<?php ?>標簽或<?= ?>標簽中。

編碼:
PHP文件必須使用無BOM的UTF-8編碼。

副作用:
一個PHP文件可以定義符號(比如類、函數、常量等),或者執行只有唯一副作用的操作(比如輸出結果、處理數據等),但是不能同時做這兩件事,盡量是一個PHP文件的功能單一。在操作的時候盡量把變量、類、函數的聲明分開,通過include或require文件的方式來使用。

如下不符合規范:原因有四種類型的操作

<?php // 改變設置 ini_set('error_reporting', E_ALL);// 加載文件 include "file.php";// 打印輸出 echo "<html>\n";// 聲明 function foo() {// function body }

符合規范如下:

<?php // 聲明 function foo() {// function body }// 條件判斷 if (! function_exists('bar')) {function bar(){// function body} }

命名空間和類:
命名空間和類必須遵循PSR-4自動加載器標準。

類的名稱:
每個類都有自己的命名空間,且都在頂級命名空間下,類名必須使用駝峰式(CamelCase)。
PHP 5.3 及以上,必須使用正式的命名空間,例如:

<?php // PHP 5.3 及以后 namespace Vendor\Model;class Foo { }

常量:
常量必須全部是用大寫,并且使用下劃線(_)分開。例如:

<?php namespace Vendor\Model;class Foo {const VERSION = '1.0';const DATE_APPROVED = '2012-06-01'; }

類的方法:
類的方法必須使用小寫字母開頭的駝峰式(camelCase)命名。單獨一個的話就直接開頭大寫

PSR-2

貫徹PSR-1:
使用PSR-2代碼標準之前要先貫徹PSR-1的代碼標準。

文件和代碼行:
PHP文件必須使用Unix風格的換行符(LF, linefeed),最后要有一個空行,僅包含PHP代碼的文件而且不能使用PHP關閉標簽?>,每行代碼不應該超過80個字符,每行末尾不能有空格,每行只能有一條語句,可以在適當的地方添加空行提高代碼的閱讀性。

不加上?>關閉標簽,可以避免意料之外的輸出錯誤,如果加上關閉標簽,且在關閉標簽后有空行,那么空行會被當成輸出,導致意想不到的錯誤。

縮進:
必須以4個空格為縮進不能使用制表符(Tab鍵)縮進。

在不同的編輯器中,空格的渲染效果基本一致,而制表符的寬度各有差異。

?關鍵字:
PHP的關鍵字必須使用小寫,而且true,?false, 和?null也必須小寫。

命名空間和use聲明:
現在,namespace聲明之后必須要有一個空行,而且use聲明必須放在namespace之后,必須分別使用use引入命名空間,而且use后要有空行,例如:

<?php namespace Vendor\Package;use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass;// ... additional PHP code ...

類的繼承和實現:
extends和implements關鍵字必須和類名在同一行,類、接口和Traits定義體的起始括號應該在類名之后新起一行,結束括號也必須新起一行,例如:

<?php namespace Vendor\Package;use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass;class ClassName extends ParentClass implements \ArrayAccess, \Countable {// constants, properties, methods }

如果implements后面后很多類導致一行很長,可以依次將需要的類另起新行并縮進4個空格,如下:

<?php namespace Vendor\Package;use FooClass; use BarClass as Bar; use OtherVendor\OtherPackage\BazClass;class ClassName extends ParentClass implements\ArrayAccess,\Countable,\Serializable {// constants, properties, methods }

可見性:
類中的每個屬性和方法都要聲明可見性,有public、private和protected,不能使用var關鍵詞來聲明,老版本的PHP會在私有屬性前加上_,一行只能聲明一個屬性,例如:

<?php namespace Vendor\Package;class ClassName {public $foo = null; }

方法:
類中的所有方法也應該定義可見性,方法名后面不能有空格,方法體的括號位置和類定義體的括號位置一樣,都要新起一行,結束括號也要新起一行。方法參數的起始圓括號之后沒有空格,結束括號之前也沒有空格,有多個參數是,每個參數的逗號后面加一個空格,例如:

<?php namespace Vendor\Package;class ClassName {public function fooBarBaz($arg1, &$arg2, $arg3 = []){// method body} }

如果參數比較多,需要換行時,可以如下:

<?php namespace Vendor\Package;class ClassName {public function aVeryLongMethodName(ClassTypeHint $arg1,&$arg2,array $arg3 = []) {// method body} }

abstract、final和static:
現在,abstract、final必須在可見性修飾符之前,static聲明必須放在可見性修飾符之后,例如:

<?php namespace Vendor\Package;abstract class ClassName {protected static $foo;abstract protected function zim();final public static function bar(){// method body} }

方法和函數的調用:
在調用方法和函數時,圓括號必須跟在函數名之后,函數的參數之間有一個空格

<?php bar(); $foo->bar($arg1); Foo::bar($arg2, $arg3);

如果參數比較多,一行放不下時,如下處理:

<?php $foo->bar($longArgument,$longerArgument,$muchLongerArgument );

PHP的控制結構:
PHP的控制結構包括if、else、elseif、switch、case、while、do while、for、foreach、try和catch。如果這些關鍵詞后面有一對原括號,開始括號前必須有一個空格,與方法和類的定義體不同,控制結構關鍵詞后面的起始括號應該和控制結構關鍵詞寫在同一行,例如:

<?php $gorilla = new \Animals\Gorilla; $ibis = new \Animals\StrawNeckedIbis;if ($gorilla->isWake() === true) {do {$gorilla->beatChest();} while ($ibis->isAsleep() === true);$ibis->flyAway(); }

PHP閉包函數:
閉包函數在聲明時,function關鍵詞后必須有一個空格,同時use關鍵詞前后也必須有一個空格。起始大括號不需要另起新行,詳細的如下代碼:

<?php $closureWithArgs = function ($arg1, $arg2) {// body };$closureWithArgsAndVars = function ($arg1, $arg2) use ($var1, $var2) {// body };

閉包函數有多個參數時,處理方式和方法的參數一樣:

<?php $longArgs_noVars = function ($longArgument,$longerArgument,$muchLongerArgument ) {// body };$noArgs_longVars = function () use ($longVar1,$longerVar2,$muchLongerVar3 ) {// body };$longArgs_longVars = function ($longArgument,$longerArgument,$muchLongerArgument ) use ($longVar1,$longerVar2,$muchLongerVar3 ) {// body };$longArgs_shortVars = function ($longArgument,$longerArgument,$muchLongerArgument ) use ($var1) {// body };$shortArgs_longVars = function ($arg) use ($longVar1,$longerVar2,$muchLongerVar3 ) {// body };

注意:以上規則同樣適用于將閉包作為函數或方法的參數,如下:

<?php $foo->bar($arg1,function ($arg2) use ($var1) {// body},$arg3 );

PSR-3

與PSR-1和PSR-2不同,PSR-3規定了一套通用的日志記錄器接口(Psr\Log\LoggerInterface),為了符合PSR-3規范,框架必須實現該規范中的接口,這樣可以更多的兼容第三方應用。PSR-3規范中包含了9個方法,每個方法都對應了RFC 5424協議的一個日志級別,而且都接受兩個參數$message和$context,如下

<?phpnamespace Psr\Log;/*** Describes a logger instance** The message MUST be a string or object implementing __toString().** The message MAY contain placeholders in the form: {foo} where foo* will be replaced by the context data in key "foo".** The context array can contain arbitrary data, the only assumption that* can be made by implementors is that if an Exception instance is given* to produce a stack trace, it MUST be in a key named "exception".** See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-3-logger-interface.md* for the full interface specification.*/ interface LoggerInterface {/*** System is unusable.** @param string $message* @param array $context* @return void*/public function emergency($message, array $context = array());/*** Action must be taken immediately.** Example: Entire website down, database unavailable, etc. This should* trigger the SMS alerts and wake you up.** @param string $message* @param array $context* @return void*/public function alert($message, array $context = array());/*** Critical conditions.** Example: Application component unavailable, unexpected exception.** @param string $message* @param array $context* @return void*/public function critical($message, array $context = array());/*** Runtime errors that do not require immediate action but should typically* be logged and monitored.** @param string $message* @param array $context* @return void*/public function error($message, array $context = array());/*** Exceptional occurrences that are not errors.** Example: Use of deprecated APIs, poor use of an API, undesirable things* that are not necessarily wrong.** @param string $message* @param array $context* @return void*/public function warning($message, array $context = array());/*** Normal but significant events.** @param string $message* @param array $context* @return void*/public function notice($message, array $context = array());/*** Interesting events.** Example: User logs in, SQL logs.** @param string $message* @param array $context* @return void*/public function info($message, array $context = array());/*** Detailed debug information.** @param string $message* @param array $context* @return void*/public function debug($message, array $context = array());/*** Logs with an arbitrary level.** @param mixed $level* @param string $message* @param array $context* @return void*/public function log($level, $message, array $context = array()); }

關于message參數:

$message必須是一個字符串或者是含有__toString()方法的對象,$message應該包含占位符,例如{placeholder_name},占位符由{、占位符名稱和}組成,不能包含空格,占位符名稱可以由A-Z, a-z, 0-9, _組成,第三方實現可以用$context參數來替換占位符,占位符名稱必須和$context數組的key對應。如下例子是使用$context中的值替換$message中的占位符:

<?php/*** Interpolates context values into the message placeholders.*/ function interpolate($message, array $context = array()) {// build a replacement array with braces around the context keys$replace = array();foreach ($context as $key => $val) {// check that the value can be casted to stringif (!is_array($val) && (!is_object($val) || method_exists($val, '__toString'))) {$replace['{' . $key . '}'] = $val;}}// interpolate replacement values into the message and returnreturn strtr($message, $replace); }// a message with brace-delimited placeholder names $message = "User {username} created";// a context array of placeholder names => replacement values $context = array('username' => 'Bolivar');// echoes "User Bolivar created" echo interpolate($message, $context);

關于context參數:

$context是一個數組參數,用于構造復雜的日志消息,$context中的值不能跑出任何PHP異常或錯誤。如果$context中包含Exception對象,則該對象的key必須為exception。

PSR-3日志記錄器的使用

推薦使用monolog/monolog,這樣可以讓我們不需要浪費更多的時間在編寫一個日志記錄器了。Monolog組建完全實現了PSR-3接口,而且便于使用自定義的消息格式化程序和處理程序擴展功能,通過Monolog可以把日志消息寫入文本文件、系統日志和數據庫中,還能通過電子郵件發送,并且還支持Slack和遠程服務器。如下展示了如何設置Monolog,并把日志消息寫入文本文件:

use Monolog/Logger; use Monolog/Handler/StreamHandler;// 創建日志記錄器 $log = new Logger('myApp'); $log->pushHandler(new StreamHandler('logs/development.log, Logger::DEBUG)); $log->pushHandler(new StreamHandler('logs/production.log', Logger::WARNING));// 使用日志記錄器 $log->debug("This is a debug message"); $log->warning("This is a warning message");

PSR-4

PSR-4規范描述了一個標準的自動加載器策略,指在運行時按需查找PHP類、接口或Traits。支持PSR-4自動加載器標準的PHP組建和框架,使用同一個自動加載器就能找到相關代碼,然后將其載入PHP解釋器。有了這個功能,就可以把現代PHP生態系統中很多客戶操作的組件聯系起來。

編寫一個PSR-4自動加載器

PSR-4規范不要求改變代碼的實現方式,只建議如何使用文件系統目錄結構和PHP命名空間組織代碼,PSR-4規范以來PHP命名空間和文件系統目錄結構查找并加載PHP類、接口和Traits,這正是PSR-4的精髓所在。下面我們來自己手動實現一個PSR-4自動加載器:

<?php /*** 使用SPL組冊這個自動加載函數后,遇到下述代碼時這個函數會嘗試 從/path/to/project/src/Baz/Qux.php文件中加載\Foo\Bar\Baz\Qux類:* new \Foo\Bar\Baz\Qux;* @param string $class 完全限定的類名。* @return void**/ spl_autoload_register(function ($class) {// 項目的命名空間前綴$prefix = 'Foo\\Bar\\';// 目錄前綴對應的根目錄$base_dir = __DIR__ . '/src/';// 判斷傳入的類是否使用了這個命名空間前綴$len = strlen($prefix);if (strncmp($prefix, $class, $len) !== 0) {// 沒有使用,交給注冊的下一個自動加載器處理return;}// 獲取去掉前綴后的類名$relative_class = substr($class, $len);// 把命名空間前綴替換成根目錄,// 在去掉前綴的類名中,把命名空間分隔符替換成目錄分隔符,// 然后在后面加上.php$file = $base_dir . str_replace('\\', '/', $relative_class) . '.php';// 如果該文件存在,就將其導入if (file_exists($file)) {require $file;} });

?

總結

以上是生活随笔為你收集整理的PHP的PSR规范的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。