首頁 php教程 php手册 《Advanced PHP Programming》读书笔记

《Advanced PHP Programming》读书笔记

Jun 06, 2016 pm 07:54 PM
筆記 讀書

此书无中文版,但是写的极好!本来想翻译的,可是时间不允许了。 http://www.amazon.com/Advanced-PHP-Programming-George-Schlossnagle/dp/0672325616/ref=pd_rhf_dp_p_t_1 约定:加粗字体表示章节,由于时间关系解释性的说明全部省略。 《高级PHP程序设计

此书无中文版,但是写的极好!本来想翻译的,可是时间不允许了。

http://www.amazon.com/Advanced-PHP-Programming-George-Schlossnagle/dp/0672325616/ref=pd_rhf_dp_p_t_1

 

约定:加粗字体表示章节,由于时间关系解释性的说明全部省略。

《高级 PHP程序设计》

简介

PHP在企业级开发

 一个编程语言满足下面6方面才能满足关键的商业应用:

快速原型设计和实施

现代编程范式的支持

可伸缩性

高性能

互操作性

可扩展性

平台和版本

本书主要是针对php5,更主要是使你的代码更快,更敏捷,设计的更好。

本书基于linux编写的。
平台和版本
平台和版本


第一部分 实施和开发方法
第一章 代码风格

选择适合你的代码风格

代码格式化和布局

包括行的长度,使用空白,使用SQL是最基本的技能。

 

缩进

本书使用缩进来表示代码块,但不能夸大其重要性。虽然php中不强制缩进,但是缩进是一个有用的工具。

考虑下面的代码
if($month  == 'september' || $month  == 'april' || $month  == 'june' || $month  ==
'november') { return 30;
}
else if($month == 'february') {
if((($year % 4 == 0) && !($year % 100)) || ($year % 400 == 0)) {
return 29;
}
else {
return 28;
}
}
else {
return 31;
}


和下面的代码比较,除了缩进都是相同的。

if($month  == 'september' ||
   $month  == 'april'     ||
   $month  == 'june'      ||
   $month  == 'november') {
  return 30;
}
else if($month == 'february') {
  if((($year % 4 == 0) && ($year % 100)) || ($year % 400 == 0)) {
    return 29;
  }
  else {
    return 28;
  }
}
else {
  return 31;
}
登入後複製


后一段代码比前一段在逻辑上更好分辨。

 

当你使用tab代码缩进,你需要做出一致性选择使用硬或软tab,硬是常规选项,而软实际上是由一定量的空格表示,使用软的好处是他们总是相同,我比较喜欢软。当你使用硬,在多个开发人员使用不同的编辑器会造出不一致。

 

 

行长

前面的第一段代码太长,这样不便于跟踪和调试,应该把长行分为多行,例如:

<strong>if($month  == 'september' || $month  == 'april' ||
   $month  == 'june' || $month  == 'november') {
        return 30;
}
</strong>
登入後複製


可以缩进对齐条件

<strong>if($month  == 'september' ||
   $month  == 'april' ||
   $month  == 'june' ||
   $month  == 'november')
{
  return 30;
}
</strong>
登入後複製


这个方法同样适合于函数的参数

mail("postmaster@example.foo",
     "My Subject",
     $message_body,
     "From: George Schlossnagle george@omniti.com>\r\n");

一般,我会80个字符就要换行,因为这是一个标准unix终端窗口的宽度。

 

使用空白

$lt = localtime();
$name = $_GET['name'];
$email = $_GET['email'];
$month = $lt['tm_mon'] + 1;
$year = $lt['tm_year'] + 1900;
$day = $lt['tm_day'];
$address = $_GET['address'];
登入後複製

 

通过空白进行逻辑分组

$name    = $_GET['name'];
$email   = $_GET['email'];
$address = $_GET['address'];

$lt    = localtime();
$day   = $lt['tm_day'];
$month = $lt['tm_mon'] + 1;
$year  = $lt['tm_year'] + 1900;
登入後複製


SQL指引

$query = "SELECT FirstName, LastName FROM employees, departments WHERE
employees.dept_id = department.dept_id AND department.Name = 'Engineering'";
登入後複製

 

上面的sql组织的不好,可以从以下方面修改:

关键字大写;关键字换行;使用表的别名保持代码整洁

$query = "SELECT firstname,
                 lastname
          FROM employees e,
              departments d
          WHERE e.dept_id = d.dept_id
          AND d.name = 'Engineering'";
登入後複製


控制流结构

两种方式:条件和循环

 

控制结构使用大括号

php采用c语言风格,单行php条件语句不用使用大括号,例如下面的代码是正确的:

if(isset($name))
  print "Hello $name";
登入後複製


但是,这样会引起混乱,应该总是使用大括号

if(isset($name)) {
    print "Hello $name";
}
else {
    print "Hello Stranger";
}

登入後複製


始终使用大括号

条件语句中三种使用括号的风格

BSD风格我比较喜欢

if ($condition)
{
      // statement
}
登入後複製

 

GNU风格

if ($condition)
  {
      // statement
  }

登入後複製

K&R 风格

if ($condition) {
      // statement
}

登入後複製

for和foreach和while
如果for或者foreach循环可以做的事情不应该使用while循环

function is_prime($number)
{
  if(($number % 2) != 0) {
    return true;
  }
  $i = 0;
  while($i <p><br>不小心会增加无限循环,使用for更加自然</p><pre class="brush:php;toolbar:false">function is_prime($number)
{
  if(($number % 2) != 0) {
    return true;
  }
  for($i=3; $i <p>对数组迭代的时候foreach比for更好</p><pre class="brush:php;toolbar:false">$array = (3, 5, 10, 11, 99, 173);
foreach($array as $number) {
  if(is_prime($number)) {
    print "$number is prime.\n";
  }
}

登入後複製

这样比使用for更快,因为避免计数器的使用。


使用break和continue控制循环

不需要循环的时候使用break跳出循环

$has_ended = 0;
while(($line =  fgets($fp)) !== false) {
  if($has_ended) {
  }
  else {
    if(strcmp($line, '_END_') == 0) {
       $has_ended = 1;
    }
    if(strncmp($line, '//', 2) == 0) {

    }
    else {
      // parse statement
    }
  }
}


登入後複製


这个例子比前面的更短,而且避免了深层次的嵌套

while(($line =  fgets($fp)) !== false) {
  if(strcmp($line, '_END_') == 0) {
    break;
  }
  if(strncmp($line, '//', 2) == 0) {
    continue;
  }
  // parse statement
}

登入後複製

避免很深层的循环

常见的错误是在一个浅循环中使用深层嵌套

$fp = fopen("file", "r");
if ($fp) {
  $line = fgets($fp);
  if($line !== false) {
    // process $line
  }  else {
    die("Error: File is empty);
}
else {  die("Error: Couldn't open file");
}

登入後複製


消除不必要的嵌套

$fp = fopen("file", "r");
if (!$fp) {
 die("Couldn't open file");
}
$line = fgets($fp);
if($line === false) {
 die("Error: Couldn't open file");
}
// process $line

登入後複製

命名符号

function test($baz)
{
  for($foo = 0; $foo 下面的代码使用更有意义的变量名和函数名<br><pre class="brush:php;toolbar:false">function create_test_array($size)
{
  for($i = 0; $i <p>三类命名规则:</p><p>全局变量要使用在全局范围</p><p>长时间存在的变量可存在于任何范围但要包含重要信息或大块代码的引用</p><p>临时变量用于小部分代码保持临时信息<br></p><p><strong>常量和真正的全局变量</strong></p><p>全局变量和常量要使用大写字母,便于辨识。</p><pre class="brush:php;toolbar:false">$CACHE_PATH = '/var/cache/';
...
function list_cache()
{
  global $CACHE_PATH;
  $dir = opendir($CACHE_PATH);
  while(($file = readdir($dir)) !== false && is_file($file)) {
    $retval[] = $file;
  }
  closedir($dir);
  return $retval;
}

登入後複製


错误使用全局变量的原因:

它们可以在任何地方被改变不好定位;

污染了全局命名空间,例如使用一个全局变量命名为计数器$counter同时你还有另一个计数器也是$counter,随着代码的增长这种冲突越来越不可避免;

解决方案是使用一个“访问器”函数。

global $database_handle;
global $server;
global $user;
global $password;
$database_handle = mysql_pconnect($server, $user, $password);

登入後複製


可以使用如下的类:

class Mysql_Test {
  public $database_handle;
  private $server = 'localhost';
  private $user = 'test';
  private $password = 'test';
  public function __construct()
  {
    $this->database_handle =
      mysql_pconnect($this->server, $this->user, $this->password);
  }
}

登入後複製

第二章中将探索更有效的方式处理这个例子,当我们处理单例模式和封装类时。

有时候,你需要访问一个特定的变量,像这样:

$US_STATES = array('Alabama', ... , 'Wyoming');

登入後複製


这个例子中类做了太多的事情,如果你想在这里避免全局变量,你可以使用一个访问函数全局数组使用一个静态变量。

function us_states()
{
  static $us_states = array('Alabama', ... , 'Wyoming');
  return $us_states;
}

登入後複製

长时间存在的变量
应该有简洁描述性的名称,长时间存在的变量不一定是全局的,甚至在主题范围内。

下面例子中变量名帮助理解代码的意思。

function clean_cache($expiration_time)
{
  $cachefiles = list_cache();
  foreach($cachefiles as $cachefile) {
    if(filemtime($CACHE_PATH."/".$cachefile) > time() + $expiration_time) {
      unlink($CACHE_PATH."/".$cachefile);
    }
  }
}

登入後複製

临时变量

临时变量的名称要简明扼要。由于临时变量通常只存在于一个小的代码块,所以他们并不需要有说明性名称。 特别是用于循环的数值变量应该始终被命名为J,K,L,M,和n
等。 

比较这个例子

$number_of_parent_indices = count($parent);
for($parent_index=0; $parent_index <p><br>例如</p><pre class="brush:php;toolbar:false">$pcount = count($parent);
for($i = 0; $i <p><br>这样会更妙</p><pre class="brush:php;toolbar:false">foreach($parent as $child) {
  foreach($child as $element) {
    my_function($element);
  }
}

登入後複製


 多词名称

$numElements = count($elements);

$num_elements = count($elements);

推荐第二种命名方法,原因是:

情况发生变化,你为了保持一致性不得不$CACHEDIR和$PROFANITYMACROSET

数据库不区分大小写;

非英语本土人士会在字典中更好的查到。

 

函数名

函数名和正常的变量名类似的处理方式,全部小写,多字要用下划线分割,推荐K&R风格:

function print_hello($name)
{
  print "Hello $name";
}

登入後複製

 foo() 和bar() 反映不出你的代码更多的信息,让你的代码看起来很不专业。

 

类名

参考官方的Java风格指南,类名应遵循以下规则:

一个类的名字第一个字母是大写;
下划线应该用来模拟嵌套的命名空间;

多字的类名应连接在一起,每个单词的首字母应大写。

class XML_RSS {}
class Text_PrettyPrinter {}

登入後複製

方法名

Java风格的串连字多字的方法名称是第一个字母后的单词第一个字母大写

class XML_RSS
{
    function startHandler() {}
}
登入後複製


 命名一致性

类似目的的变量保持类似的名称

$num_elements = count($elements);
...
$objects_cnt = count($objects);

推荐下面的风格
登入後複製
$max_elements;
$min_elements;
$sum_elements;
$prev_item;
$curr_item;
$next_item;
登入後複製
<strong>匹配变量名和架构名</strong>
登入後複製
与数据库中的记录相关联的变量名称应该始终有相匹配的名字。
登入後複製
$query = "SELECT firstname, lastname, employee_id
          FROM employees";
$results = mysql_query($query);
while(list($firstname, $lastname, $employee_id) = mysql_fetch_row($results)) {
  // ...
}

登入後複製
下面的代码容易混淆
登入後複製
$first_query = "SELECT a,b
          FROM subscriptions
          WHERE subscription_id = $subscription_id";
$results = mysql_query($first_query);
list($a, $b) = mysql_fetch_row($results);
// perform necessary logic
$new_a = $b;
$new_b = $a;
$second_query = "UPDATE subscriptions
                 SET a = '$new_a',
                     B = '$new_b'
                 WHERE subscription_id = $subscription_id";
Mysql_query($second_query);

登入後複製

开发人员为了保持列名和变量名在update中一致性

$first_query = "SELECT a,b
          FROM subscriptions
          WHERE subscription_id = $subscription_id";
$results = mysql_query($first_query);
list($b, $a) = mysql_fetch_row($results);
// perform necessary logic
$second_query = "UPDATE subscriptions
                 SET a = '$a',
                     B = '$b'
                 WHERE subscription_id = $subscription_id";
mysql_query($second_query);

登入後複製

这一代码会完全混乱不堪。

 

避免代码混乱

一致的代码风格让代码看一起是清晰的

print "Hello $username";
?>

但是不应该使用!
登入後複製

因为无法打印正常的XML内联文件

<?xml version="1.0" ?>
登入後複製


<?php print "Hello $username";
? >

登入後複製


 

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

小紅書筆記怎麼刪除 小紅書筆記怎麼刪除 Mar 21, 2024 pm 08:12 PM

小紅書筆記怎麼刪除?在小紅書APP中是可以編輯筆記的,多數的用戶不知道小紅書筆記如何的刪除,接下來就是小編為用戶帶來的小紅書筆記刪除方法圖文教程,有興趣的用戶快來一起看看吧!小紅書使用教學小紅書筆記怎麼刪除1、先打開小紅書APP進入到主頁面,選擇右下角【我】進入到專區;2、之後在我的專區,點擊下圖所示的筆記頁面,選擇要刪除的筆記;3、進入到筆記頁面,右上角【三個點】;4、最後下方會展開功能欄,點選【刪除】即可完成。

小紅書刪除的筆記能恢復嗎 小紅書刪除的筆記能恢復嗎 Oct 31, 2023 pm 05:36 PM

小紅書刪除的筆記不能恢復。小紅書作為知識分享和購物平台,為使用者提供了記錄筆記和收藏有用資訊的功能。根據小紅書的官方說明,已經刪除的筆記是無法恢復的。小紅書平台並沒有提供專門的筆記恢復功能。這意味著,一旦在小紅書中刪除了筆記,無論是不小心誤刪還是其他原因,一般情況下是無法從平台上找回被刪除的內容的。如果遇到特殊情況,可以嘗試聯絡小紅書的客服團隊,看是否能夠協助解決問題。

小紅書發布過的筆記不見了怎麼辦?它剛發的筆記搜不到的原因是什麼? 小紅書發布過的筆記不見了怎麼辦?它剛發的筆記搜不到的原因是什麼? Mar 21, 2024 pm 09:30 PM

作為一名小紅書的用戶,我們都曾經遇到過發布過的筆記突然不見了的情況,這無疑讓人感到困惑和擔憂。在這種情況下,我們該怎麼辦呢?本文將圍繞著「小紅書發布過的筆記不見了怎麼辦」這個主題,為你詳細解答。一、小紅書發布過的筆記不見了怎麼辦?首先,不要驚慌。如果你發現筆記不見了,保持冷靜是關鍵,不要慌張。這可能是由於平台系統故障或操作失誤引起的。檢查發布記錄很簡單。只要打開小紅書App,點擊“我”→“發布”→“所有發布”,就可以查看自己的發布記錄。在這裡,你可以輕鬆找到之前發布的筆記。 3.重新發布。如果找到了之

如何在最新的iOS 17系統中連接iPhone上的Apple Notes 如何在最新的iOS 17系統中連接iPhone上的Apple Notes Sep 22, 2023 pm 05:01 PM

使用新增連結功能在iPhone上連結AppleNotes。筆記:如果您已安裝iOS17,則只能在iPhone上的AppleNotes之間建立連結。在iPhone上開啟「備忘錄」應用程式。現在,打開要在其中添加連結的註釋。您也可以選擇建立新備忘錄。點擊螢幕上的任何位置。這將向您顯示一個選單。點擊右側的箭頭以查看“新增連結”選項。點擊它。現在,您可以鍵入註解的名稱或網頁URL。然後,點擊右上角的完成,新增的連結將出現在筆記中。如果要添加指向某個單字的鏈接,只需雙擊該單字即可將其選中,選擇“添加鏈接”並按

小紅書怎麼在筆記中加入商品連結 小紅書在筆記中加入商品連結教學 小紅書怎麼在筆記中加入商品連結 小紅書在筆記中加入商品連結教學 Mar 12, 2024 am 10:40 AM

小紅書怎麼在筆記中添加商品連結?在小紅書這款app中用戶不僅可以瀏覽各種內容還可以進行購物,所以這款app中關於購物推薦、好物分享的內容是非常多的,如果小夥伴在這款app也是一個達人的話,也可以分享一些購物經驗,找到商家進行合作,在筆記中添加連結之類的,很多人都願意使用這款app購物,因為不僅方便,而且有很多達人會進行一些推薦,可以一邊瀏覽有趣內容,一邊看看有沒有適合自己的衣服商品。一起看看如何在筆記中添加商品連結吧!小紅書筆記添加商品連結方法  在手機桌面上開啟app。  在app首頁點擊

微軟推出閱讀進度更新,將於 2022 年夏季推出閱讀教練 微軟推出閱讀進度更新,將於 2022 年夏季推出閱讀教練 Apr 27, 2023 pm 08:19 PM

自大流行開始以來,教育格局發生了巨大變化。這影響了教師和學生,甚至他們的教育需求。藉此,我們見證了包括閱讀進度在內的各種創新教育工具的誕生。現在,微軟計劃透過引入閱讀教練將學習提升到更高的水平。 「我們很高興分享閱讀教練將內建在沉浸式閱讀器中,這是我們支持公平教育的免費閱讀工具,」微軟教育副總裁PaigeJohnson在微軟教育部落格文章中寫道。 「現在,各個層級的學生都可以透過Microsoft365應用獲得高品質、個人化的閱讀流暢度指導。將閱讀教練嵌入沉浸式閱讀器還為學生提供微軟翻

小紅書發筆記教學怎麼弄?它發布筆記可以屏蔽人嗎? 小紅書發筆記教學怎麼弄?它發布筆記可以屏蔽人嗎? Mar 25, 2024 pm 03:20 PM

小紅書作為一個生活風格分享平台,涵蓋了美食、旅行、美妝等各個領域的筆記。許多用戶希望在小紅書上分享自己的筆記,但卻不清楚如何操作。在這篇文章中,我們將詳細介紹小紅書發布筆記的流程,並探討如何在平台上封鎖特定使用者。一、小紅書發布筆記教學怎麼弄? 1.註冊登入:首先,需要在手機上下載小紅書APP,並完成註冊登入。在個人中心完善個人資料是很重要的。透過上傳個人資料、填寫暱稱和個人簡介,可以讓其他使用者更容易了解你的訊息,也能幫助他們更好地關注你的筆記。 3.選擇發布頻道:在首頁下方,點選「發筆記」按鈕,選擇你想

在 iPhone 的 Notes 應用程式中掃描列印和手寫筆記 在 iPhone 的 Notes 應用程式中掃描列印和手寫筆記 Nov 29, 2023 pm 11:19 PM

2022年,Apple為iPhone和iPad上的Notes應用程式添加了一項新功能,可讓您快速掃描列印或手寫文字並將其儲存為數位文字格式。繼續閱讀以了解其工作原理。在早期版本的iOS和iPadOS上,將文字掃描到Apple的Notes應用程式中需要點擊筆記的文字字段,然後點擊彈出式選單中的「即時文字」選項。然而,Apple在2022年使現實世界的筆記數位化變得更加容易。以下步驟向您展示如何在執行iOS15.4或iPadOS15.4及更高版本的裝置上完成此操作。在iPhone或iPad上,打開“

See all articles