本文目錄一覽:
- 1、效率為王 分享幾個提升php運行效率的代碼規
- 2、PHP代碼修改
- 3、關於PHP的問題
- 4、什麼是psr-0,psr-1,psr-2標準
- 5、高質量PHP代碼的50個技巧(3)
- 6、今天說一下php多人開發大項目時如何做到代碼規範化
效率為王 分享幾個提升php運行效率的代碼規
1.盡量靜態化:
之所以強調靜態化,是因為靜態化後網站的訪問速度可以提升1/4以上,內容越多,這個提升的效果越明顯.
其實靜態方法和非靜態方法的效率主要區別在內存:靜態方法在程序開始時生成內存,實例方法在程序運行中生成內存,所以靜態方法可以直接調用,實例方法要先成生實例,通過實例調用方法,靜態速度很快,但是多了會佔內存。
任何語言都是對內存和磁盤的操作,至於是否面向對象,只是軟件層的問題,底層都是一樣的,只是實現方法不同。靜態內存是連續的,因為是在程序開始時就生成了,而實例申請的是離散的空間,所以當然沒有靜態方法快。
靜態方法始終調用同一塊內存,其缺點就是不能自動進行銷毀,而是實例化可以銷毀。
2.echo的效率高於print,因為echo沒有返回值,print返回一個整型;並且使用echo的多重參數(譯註:指用逗號而不是句點)代替字符串連接,比如echo $str1,$str2。
測試:
echo
0.000929 – 0.001255 s (平均 0.001092 seconds)
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-hant/n/128091.html