php代碼建議規範(php代碼示例)

本文目錄一覽:

效率為王 分享幾個提升php運行效率的代碼規

1.盡量靜態化:

之所以強調靜態化,是因為靜態化後網站的訪問速度可以提升1/4以上,內容越多,這個提升的效果越明顯.

其實靜態方法和非靜態方法的效率主要區別在內存:靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,所以靜態方法可以直接調用,實例方法要先成生實例,通過實例調用方法,靜態速度很快,但是多了會佔內存。

任何語言都是對內存和磁碟的操作,至於是否面向對象,只是軟體層的問題,底層都是一樣的,只是實現方法不同。靜態內存是連續的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當然沒有靜態方法快。

靜態方法始終調用同一塊內存,其缺點就是不能自動進行銷毀,而是實例化可以銷毀。

2.echo的效率高於print,因為echo沒有返回值,print返回一個整型;並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字元串連接,比如echo $str1,$str2。

測試:

echo

0.000929 – 0.001255 s (平均 0.001092 seconds)

print

0.000980 – 0.001396 seconds (平均 0.001188 seconds)

相差8%左右,總體上echo是比較快的。

注意,echo大字元串的時候,如果沒有做調整就嚴重影響性能。使用打開apached的mod_deflate進行壓縮或者打開ob_start先將內容放進緩衝區。

3.在循環之前設置循環的最大次數,而非在在循環中;

4.如果能將類的方法定義成static,就盡量定義成static,它的速度會提升將近4倍。

5.銷毀變數去釋放內存,特別是大的數組;

數組和對象在php特別占內存的,這個由於php的底層的zend引擎引起的,

一般來說,PHP數組的內存利用率只有 1/10, 也就是說,一個在C語言裡面100M 內存的數組,在PHP裡面就要1G。

特別是在PHP作為後台伺服器的系統中,經常會出現內存耗費太大的問題。

PHP代碼修改

請確保你有「text.ttf」這個文件,你的程序用到了這個文件,不然還有錯誤。

下面是我改好的代碼:

?php if(!isset($_FILES[‘upfile’])): ?

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ /

titlewnh3的改造/title

/head

body

form action=”” enctype=”multipart/form-data” method=”post” name=”upform”

上傳文件:

input name=”upfile” type=”file”

input type=”submit” value=”上傳”br

/form

/body

/html

?php else:

if (is_uploaded_file($_FILES[‘upfile’][‘tmp_name’])){

$upfile=$_FILES[“upfile”];

$name = $upfile[“name”];

$type = $upfile[“type”];

$size = $upfile[“size”];

$tmp_name = $upfile[“tmp_name”];

$error = $upfile[“error”];

switch ($type) {

case ‘image/pjpeg’ :

$ok=1;

break;

case ‘image/jpeg’ :

$ok=1;

break;

case ‘image/gif’ :

$ok=1;

break;

case ‘image/png’ :

$ok=1;

break;

}

}

$img=getimagesize($tmp_name);

switch($img[2]){

case 1:

$img=@imagecreatefromGIF($tmp_name);

break;

case 2:

$img=@imagecreatefromJPEG($tmp_name);

break;

case 3:

$img=@imagecreatefromPNG($tmp_name);

break;

}

$te=@imagecolorallocate($img,255,255,255);

$str=iconv(“GBK”,”UTF-8″,”我會登上世界的巔峰,成為你們仰視的存在”);

imagettftext($img,12,0,20,20,$te,’text.ttf’,$str);

// header(“content-type: image/jpeg”);

imagejpeg($img,”11.jpg”);

?

html

head

meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″ /

titlewnh3的改造/title

/head

body

h1 上傳成功 /h1

/body

/html

?php endif; ?

關於PHP的問題

檢查過,感覺沒什麼問題,就是變數傳遞的問題。

按理說,其他兩個值能取到,中間這一個不會有問題的。

試處理方法

1)你先檢查一下拼寫,有沒有編碼方面的問題(英文字元結果打成了全形的,比如 ‘ 和 』等等);

2)拼寫無誤的話,你試著把中間的變數名改一下,html裡面的名稱和php文件里的名稱盡量用不同的。

3)以上都沒有問題的話,看看你的apache環境的設置上有沒有問題吧。

4)有時候程序是會出一些稀奇古怪的問題,別著急。也有可能是在傳遞的過程中數據丟失造成的,post過來的時候出了問題。列印一下$_POST[“oilqty”]試試。

5)提一點小建議:寫代碼要規範一點,該用 ” 就用 ” ,不要省事,這樣以後改動和檢查時都很方便,層次分明。

什麼是psr-0,psr-1,psr-2標準

轉自:

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代碼的50個技巧(3)

42

43

44

45

/**

Method to execute a command in the terminal

Uses :

1. system

2. passthru

3. exec

4. shell_exec

*/

function terminal($command)

{

//system

if(function_exists(‘system’))

{

ob_start();

system($command , $return_var);

$output = ob_get_contents();

ob_end_clean();

}

//passthru

else if(function_exists(‘passthru’))

{

ob_start();

passthru($command , $return_var);

$output = ob_get_contents();

ob_end_clean();

}

//exec

else if(function_exists(‘exec’))

{

exec($command , $output , $return_var);

$output = implode(“\n” , $output);

}

//shell_exec

else if(function_exists(‘shell_exec’))

{

$output = shell_exec($command) ;

}

else

{

$output = ‘Command execution not possible on this system’;

$return_var = 1;

}

return array(‘output’ = $output , ‘status’ = $return_var);

}

terminal(‘ls’);

上面的函數將運行shell命令, 只要有一個系統函數可用, 這保持了代碼的一致性.

5. 靈活編寫函數

?

1

2

3

4

5

6

function add_to_cart($item_id , $qty)

{

$_SESSION[‘cart’][‘item_id’] = $qty;

}

add_to_cart( ‘IPHONE3’ , 2 );

使用上面的函數添加單個項目. 而當添加項列表的時候,你要創建另一個函數嗎? 不用, 只要稍加留意不同類型的參數, 就會更靈活. 如:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function add_to_cart($item_id , $qty)

{

if(!is_array($item_id))

{

$_SESSION[‘cart’][‘item_id’] = $qty;

}

else

{

foreach($item_id as $i_id = $qty)

{

$_SESSION[‘cart’][‘i_id’] = $qty;

}

}

}

add_to_cart( ‘IPHONE3’ , 2 );

add_to_cart( array(‘IPHONE3’ = 2 , ‘IPAD’ = 5) );

現在, 同個函數可以處理不同類型的輸入參數了. 可以參照上面的例子重構你的多處代碼, 使其更智能.

6. 有意忽略php關閉標籤

我很想知道為什麼這麼多關於php建議的博客文章都沒提到這點.

?

1

2

3

?php

echo “Hello”;

//Now dont close this tag

這將節約你很多時間. 我們舉個例子:

一個 super_class.php 文件

?

1

2

3

4

5

6

7

8

9

?php

class super_class

{

function super_function()

{

//super code

}

}

?

//super extra character after the closing tag

index.php

?

1

2

require_once(‘super_class.php’);

//echo an image or pdf , or set the cookies or session data

這樣, 你將會得到一個 Headers already send error. 為什麼? 因為 「super extra character」 已經被輸出了. 現在你得開始調試啦. 這會花費大量時間尋找 super extra 的位置。因此, 養成省略關閉符的習慣:

?

1

2

3

4

5

6

7

8

9

?php

class super_class

{

function super_function()

{

//super code

}

}

//No closing tag

這會更好.

7. 在某地方收集所有輸入, 一次輸出給瀏覽器

這稱為輸出緩衝, 假如說你已在不同的函數輸出內容:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

function print_header()

{

echo “p id=’header’Site Log and Login links/p”;

}

function print_footer()

{

echo “p id=’footer’Site was made by me/p”;

}

print_header();

for($i = 0 ; $i 100; $i++)

{

echo “I is : $i ‘;

}

print_footer();

替代方案, 在某地方集中收集輸出. 你可以存儲在函數的局部變數中, 也可以使用ob_start和ob_end_clean. 如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

function print_header()

{

$o = “p id=’header’Site Log and Login links/p”;

return $o;

}

function print_footer()

{

$o = “p id=’footer’Site was made by me/p”;

return $o;

}

echo print_header();

for($i = 0 ; $i 100; $i++)

{

echo “I is : $i ‘;

}

echo print_footer();

為什麼需要輸出緩衝:

可以在發送給瀏覽器前更改輸出. 如 str_replaces 函數或可能是 preg_replaces 或添加些監控/調試的html內容.

輸出給瀏覽器的同時又做php的處理很糟糕. 你應該看到過有些站點的側邊欄或中間出現錯誤信息. 知道為什麼會發生嗎? 因為處理和輸出混合了.

8. 發送正確的mime類型頭信息, 如果輸出非html內容的話.

輸出一些xml.

?

1

2

3

4

5

6

$xml = ‘?xml version=”1.0″ encoding=”utf-8″ standalone=”yes”?’;

$xml = “response

code0/code

/response”;

//Send xml data

echo $xml;

工作得不錯. 但需要一些改進.

?

1

2

3

4

5

6

7

$xml = ‘?xml version=”1.0″ encoding=”utf-8″ standalone=”yes”?’;

$xml = “response

code0/code

今天說一下php多人開發大項目時如何做到代碼規範化

模塊獨立開發。寫好介面,供他人消費。 不是自己的模塊不要插手

原創文章,作者:EXUGP,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/128091.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
EXUGP的頭像EXUGP
上一篇 2024-10-03 23:24
下一篇 2024-10-03 23:24

相關推薦

  • Python周杰倫代碼用法介紹

    本文將從多個方面對Python周杰倫代碼進行詳細的闡述。 一、代碼介紹 from urllib.request import urlopen from bs4 import Bea…

    編程 2025-04-29
  • Python字元串寬度不限制怎麼打代碼

    本文將為大家詳細介紹Python字元串寬度不限制時如何打代碼的幾個方面。 一、保持代碼風格的統一 在Python字元串寬度不限制的情況下,我們可以寫出很長很長的一行代碼。但是,為了…

    編程 2025-04-29
  • PHP和Python哪個好找工作?

    PHP和Python都是非常流行的編程語言,它們被廣泛應用於不同領域的開發中。但是,在考慮擇業方向的時候,很多人都會有一個問題:PHP和Python哪個好找工作?這篇文章將從多個方…

    編程 2025-04-29
  • Python基礎代碼用法介紹

    本文將從多個方面對Python基礎代碼進行解析和詳細闡述,力求讓讀者深刻理解Python基礎代碼。通過本文的學習,相信大家對Python的學習和應用會更加輕鬆和高效。 一、變數和數…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • 倉庫管理系統代碼設計Python

    這篇文章將詳細探討如何設計一個基於Python的倉庫管理系統。 一、基本需求 在著手設計之前,我們首先需要確定倉庫管理系統的基本需求。 我們可以將需求分為以下幾個方面: 1、庫存管…

    編程 2025-04-29
  • 寫代碼新手教程

    本文將從語言選擇、學習方法、編碼規範以及常見問題解答等多個方面,為編程新手提供實用、簡明的教程。 一、語言選擇 作為編程新手,選擇一門編程語言是很關鍵的一步。以下是幾個有代表性的編…

    編程 2025-04-29
  • Python實現簡易心形代碼

    在這個文章中,我們將會介紹如何用Python語言編寫一個非常簡單的代碼來生成一個心形圖案。我們將會從安裝Python開始介紹,逐步深入了解如何實現這一任務。 一、安裝Python …

    編程 2025-04-29
  • 怎麼寫不影響Python運行的長段代碼

    在Python編程的過程中,我們不可避免地需要編寫一些長段代碼,包括函數、類、複雜的控制語句等等。在編寫這些代碼時,我們需要考慮代碼可讀性、易用性以及對Python運行性能的影響。…

    編程 2025-04-29
  • Python愛心代碼動態

    本文將從多個方面詳細闡述Python愛心代碼動態,包括實現基本原理、應用場景、代碼示例等。 一、實現基本原理 Python愛心代碼動態使用turtle模塊實現。在繪製一個心形的基礎…

    編程 2025-04-29

發表回復

登錄後才能評論