php高質量
❶ Web 開發中,python 和 php 哪個有優勢為什麼
從框架數量和成熟度看,PHP都優於Python;從開發效率上看,Python又有絕對的優勢;從安全的角度看,這兩門語言都很常用,但php的漏洞被挖掘得比較多,也較危險,而Python被光顧的幾率還是比較小的。但最終的優勢還是取決於開發人員,優秀的開發人員能彌補很大一部分缺陷。
以目前的情況下,PHP更具優勢,php在web開發方面性能優點很突出,能很快速地開發中小型網站。此外,開源的程序很多,如dedecms ecshop wordpress discuz等等
php的框架也很豐富,如thinkphp 功能強大,簡單易學,小巧靈活
Yii框架 完全面向對象,學習門檻較高,但功能特別強大
Zend Framework 官方推薦的大型重量級框架
而與php配套的mysql資料庫,apache伺服器,linux系統,都是開源產品,不用花錢,也不用擔心侵權,所以php是web開發的居家必備之編程語言
❷ 如何寫高質量的PHP代碼
可讀性: 個人覺得這個尤其重要, 你的變數名, 方法名能不能讓人見名知義. 命名是否統一, 不散漫.
可擴展性: 可擴展的程序的生命力才是強大的, 高質量的代碼必須具有高可擴展性的特點. php本身就是可以被擴展的, 擴展性非常好, 非常方便, 這個是眾所周知的. 最好的編輯器vim也是擁有無敵的擴展性.
安全性: 這個重要性不言而喻, 沒有安全, 再優雅的代碼也沒有任何意義.
耦合度: 程序的邏輯不應過分耦合, 使得牽一發而動全身. 低耦合度可以使得代碼的可重用性非常高.
運行效率: 天下武功, 唯快不破. 一個優秀的演算法可以讓程序的運行效率快幾個數量級. 數據結構+演算法=程序在今天依然不是一句空話.
❸ python與php哪個性能高
語法:PHP 的語法看起來就像沒有經過精心設計一樣,很隨意。有的語法看似很方便(用點來連接字元串), 但是卻為之後擴展造成了很多麻煩(點沒法用於訪問對象的成員), 再比如比較蛋疼的命名空間的語法。Python 相比之下要好一點,但是 Python2 和 Python3 直接存在著一些不兼容的語法變動。
編寫 HTML 模版:PHP 可以非常方便地直接用來編寫 HTML 模版,Python 需要藉助其他的語言或庫來實現。
包管理器:PHP 的包管理器(PEAR)和擴展管理器(PECL)恐怕根本沒人用,這導致引入一個新依賴的成本很高,於是很多人傾向於自己造輪子而不是引入現成的庫。Python 有統一的包管理器,雖然也有問題,但要比 PHP 好得多,引入庫之後的命名空間管理也要比 PHP 好。
擴展和庫:PHP 和 Python 都可以用 C 來編寫擴展。相比之下 Python 可用的庫要更多一點。
運行方式:PHP 運行方式比較單一(php-fpm, mod_php), Python 則可以以 fastCGI 運行,也可以自行監聽埠來處理請求。
性能:因為 PHP 運行方式單一,opcode 緩存方案也比較成熟(APC, opcache),緩存 opcode 之後運行速度很快。Python 則可能需要更多地自行優化性能。
類型系統:PHP 和 Python 都是動態類型。PHP 對類型判別比較模糊,有很多陷阱,Python 則嚴格一些。
學習成本:PHP 和學習成本都不是很高。PHP 優勢在於有比較完整的官方中文文檔,而且 PHP 應用領域只有 Web, 所以需要學習的內容較少。Python 因為學習路線較多,不太容易找到適合自己的教程和資料。
社區:PHP 的資料遍地,但是高質量的中文社區較少,普遍對官方的新功能不是很關注。Python 則要好一點。
應用領域:PHP 僅在 Web 後端方面被使用,Python 應用領域更廣泛一點,如果需要將邏輯移植到其他平台(如桌面), Python 要方便一點。
❹ PHP到底有多糟糕
php是web開發第一語言,這已經是坐穩了的事實,因為使用簡單,工具完善,開發效率高等優點為它積聚了大量的粉絲,號稱世界上最好的語言。 然而,就算是世界上最好的語言也有缺陷,下面我挑幾個php語法層面不那麼好用的特性吐槽下。
變數面前的美元($)符號
我想不明白當初php語言的設計師是怎麼想的,為什麼非要在變數名面前加上這個美元符號?每次我書寫變數時必須要按一下shift +4鍵,用其它語言可以很流暢的寫代碼,在php中卻老是被按這個shift打斷整個過程,這除了能給程序員帶來麻煩,我實在看不到有其它一丁點的好處。網上流傳著的說法好像是因為帶美元符號代碼解析起來更容易, 性能更好。但是解釋類型的語言又不只有php ,為什麼其它語言就不用讓程序員打這個討厭的美元符號。每天看著滿屏的美元符號,我口袋裡的錢也沒見多一分呀。
訪問對象成員要使用箭頭符號
明明按一下點號(.)就可以方便快捷的搞定的問題,卻非要使用簡單符號(->)來代替,真的是借我一百個腦袋也想不明白php設計者在設計這個特性是什麼邏輯。難不成是因為php解釋器最終會把php的代碼轉換成c代碼執行,而c中訪問指針的成員就是使用箭頭符號的。如果是這樣那顯然是php的設計者們偷懶了,難到不能在轉換成c執行的過程中多一步將點號轉換為箭頭符號的過程嗎?不要告訴我又是因為性能問題而辦不到,他們就不能為程序員想想?
數組即能當列表也能當字典
寫一個函數,返回一個數組類型,但是在函數的外面,鬼知道這個數組是一個list還是一個map?寫php代碼不知道被這個特性坑過多少回,如果是別人寫的函數, 又沒有注釋,那非得跑進函數里看個明白才知道應該這么樣使用這個函數才是安全的。難到就不能把array拆成兩個獨立的類型分別代表list(列表)和map(字典)嗎?這能為程序提供很大的便利,寫的代碼也更加不會出錯。
匿名函數使用外部變數必須使用use關鍵字導入
這個特性不能說完全沒有優點,對於代碼的可維護性還是能起到正面的作用的,因為這么做能讓我知道我在匿名函數體裡面對於外部會有哪些依賴,讓代碼更可控。然而,這種寫法真的是非常的不方便,每次寫lambda時,要用到外部的變數時,都要使用use導入,把代碼搞的看起來很臃腫,而且,因為其它語言沒這個限制,習慣已經養成,所以每次都會忘記使用use導入,導致代碼出錯,增加排查問題的時間,這真的不是什麼好玩的事。
用include導入文件
當把代碼模塊化時,然後在其它文件中使用,每次都需要使用這個include把文件導入進來,而且還要考慮路徑的問題,在結構復雜的項目中,非常讓人蛋疼。而像Java和Python之類的語言中,代碼管理機制設計的非常好,想用什麼import進來就可以了,根本不用考慮路徑啊,文件名大小寫啊之類的問題,能大大的提升開發效率。雖然,有框架可以解決這類問題,但畢竟是外部實現,使用起來總歸不是那麼順暢。這也算是php一個比較大的毛病了。
總結的這五點算是php中存在問題的典範了,希望php團隊能加把勁,把這些問題在未來的版本中優化掉,讓開發者寫代碼時有更好的體驗,更高的效率,讓世界上最好的語言名副其實
❺ 高質量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(" " , $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>
<code>0</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>
<code>0</code>