1. 程式人生 > >36計教您如何提高PHP程式碼質量(二) 轉自csdn

36計教您如何提高PHP程式碼質量(二) 轉自csdn

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

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

<?php
  function print_header()  
  {  
      echo "<div id='header'>Site Log and Login links</div>";  
  }     
  function print_footer()  
  {  
      echo "<div id='footer'>Site was made by me</div>";  
  } 
  print_header();  
  for($i = 0 ; $i <100; $i++)  
  {  
        echo "I is : $i <br />";  
  } 
  print_footer(); 
  ?>
以上這種情況,可以在某地方集中收集輸出. 你可以儲存在函式的區域性變數中,也可以使用ob_start和ob_end_clean. 使用PHP ob_start()函式開啟伺服器server的cache,這樣可以保證cache的內容在你呼叫flush(),ob_end_flush()(或程式執行完畢)之前不會被輸出。如下:
<?php
  function print_header()  
  {  
      echo "<div id='header'>Site Log and Login links</div>";  
  }     
  function print_footer()  
  {  
      echo "<div id='footer'>Site was made by me</div>";  
  } 
  ob_start();
  print_header();  
  for($i = 0 ; $i <100; $i++)  
  {  
        echo "I is : $i <br />";  
  } 
  print_footer(); 
  $ok = ob_get_contents();
  ob_end_clean();
  echo $ok;
  ?>

如果上面的這個還不很清楚,不能看出收集輸出的作用,我們來看下一個程式碼
<?php
ob_start();//buf1
echo ‘multiple’;
ob_start();//buf2
echo ‘bufferswork’;
$buf1 = ob_get_contents();
ob_end_clean();
$buf2 = ob_get_contents();
ob_end_clean();
ob_start();
for($i = 0 ; $i <100; $i++)  
  {  
        echo "I is : $i <br />";  
  } 
$ok = ob_get_contents();
ob_end_clean();
echo $ok;
echo $buf1;
echo "<br/>";
echo $buf2;
?>
上面這段程式碼首先輸出for迴圈的結果,然後是第二個字串,最後輸出第一個字串,可知ob_start(),ob_get_contents(),ob_end_clean();三個函式的使用方法。

8. 傳送正確的mime型別頭資訊, 如果輸出非html內容的話。

xml可以按下面這樣寫:

$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';  
$xml = "<response>      
			<code>
				0
			</code>   
		</response>";  
echo $xml;
但是還可以做一下優化:
$xml = '<?xml version="1.0" encoding="utf-8" standalone="yes"?>';  
$xml = "<response>      
			<code>
				0
			</code>   
		</response>";  
header("content-type: text/xml");  
echo $xml;

注意header行. 該行告知瀏覽器傳送的是xml型別的內容. 所以瀏覽器能正確的處理. 很多的javascript庫也依賴頭資訊。

9. 為mysql連線設定正確的字元編碼

曾經遇到過在mysql表中設定了unicode/utf-8編碼, phpadmin也能正確顯示, 但當你獲取內容並在頁面輸出的時候,會出現亂碼. 這裡的問題出在mysql連線的字元編碼.

 <? //Attempt to connect to database  
  $c = mysqli_connect($this->host , $this->username, $this->password);    //主機名,使用者名稱和密碼是作為三個私有屬性 
  //Check connection validity  
  if (!$c) 
  {  
      die ("Could not connect to the database host: <br />". mysqli_connect_error());  
  }    
  //Set the character set of the connection  
  if(!mysqli_set_charset ( $c , 'UTF8' ))  
  {  
      die('mysqli_set_charset() failed');  
  } 
  //一旦連線資料庫, 最好設定連線的 characterset. 你的應用如果要支援多語言, 這麼做是必須的.
  ?>

10. 使用 htmlentities 設定正確的編碼選項

php5.4前, 字元的預設編碼是ISO-8859-1, 不能直接輸出如À â等.,

<?
  1 $value = htmlentities($this->value , ENT_QUOTES , CHARSET);
  ?>
php5.4以後, 預設編碼為UTF-8, 這將解決很多問題. 但如果你的應用是多語言的, 仍然要留意編碼問題,.

11. 不要在應用中使用gzip壓縮輸出, 讓apache處理

考慮過使用 ob_gzhandler 嗎? 不要那樣做. 毫無意義. php只應用來編寫應用. 不應操心伺服器和瀏覽器的資料傳輸優化問題.使用apache的mod_gzip/mod_deflate 模組壓縮內容。

12. 使用json_encode輸出動態javascript內容

常會用php輸出動態javascript內容:
<?php
  $images = array( 'myself.png' , 'friends.png' , 'colleagues.png' );  
  $js_code = '';     
    foreach($images as $image)  
    {  
    $js_code .= "'$image' ,";  
    }    
    $js_code = 'var images = [' . $js_code . ']; ';     
    echo $js_code;  
    //Output is var images = ['myself.png' ,'friends.png' ,'colleagues.png' ,]; 
  ?>

更聰明的做法, 使用 json_encode:

<?php
  $images = array( 'myself.png' , 'friends.png' , 'colleagues.png' );      
  $js_code = 'var images = ' . json_encode($images);     
  echo $js_code;     
  //Output is : var images = ["myself.png","friends.png","colleagues.png"] 
  ?>