《PHP和MySQL Web開發》筆記之使用PHP(二)

來源:互聯網
上載者:User

第五章 代碼重用與函數編寫


require()或include()可以將一個檔案載入到php指令碼中。

這兩個函數幾乎等價,唯一的區別是調用失敗後require()給出一個致命錯誤,而include()只給出一個警告。

 

如果Web頁面具有一致的外觀,可以將相同的部分分離到單獨的頁面中,然後可以在php中使用require()語句將模板元素加入到頁面中。

如果希望保證一個檔案將被當作普通文本或html,而不執行任何php,可以使用readfile()作為替代方法。

 

require_once()和include_once()可以保證某個檔案只被包含一次,在使用函數庫的時候,這兩個函數非常有用,可以防止意外地多次包含相同的函數庫,從而導致函數的重複定義併產生錯誤。

 

也可以在php.ini設定檔中,使用auto_prepend_file和auto_append_file這兩個選項來設定頁首和頁尾,可以保證它們在每個頁面的前後被載入。此時就可以不再用include()語句。

auto_prepend_file = "/home/***/header.inc"

如果使用的apache,則可以給每個目錄單獨設定,在目錄中建立名為.htaccess的檔案,並在檔案中包含如下的代碼:

php_value auto_prepend_file "/home/***/header.inc"

(php的很多其它選項也可以通過這種方法來設定)

 

函式宣告方法:

function my_function()

{ echo 'myfunction'; }

函數調用不區分大小寫。function_name()等價於FunCtion_NaMe()。

 

php中函數定義不能和已有的函數重名,即不支援函數的重載。但可以包含預設的參數。

php中也可以聲明能夠接收可變參數數量的函數,通過如下三個函數:

func_num_args()、func_get_arg()以及func_get_args()。

function var_args()

{

  echo "Number of parameters:";

  echo func_num_args();

  $args = func_get_args();

  foreach($args as $arg)

    echo $arg.'<br />';

}

 

php具有超級全域變數,在任何地方可見。

使用require()和include()並不影響範圍,被包含的全域範圍變數仍然可用。

關鍵字"global"可以用來手動指定在一個函數中定義或使用的變數具有全域範圍。

unset($var)可以手動刪除變數,在此之後就不能再使用了。

 

php函數參數也有“值傳遞”和“引用”傳遞。

function increment(&$value, $amount = 1){}

$value就是引用傳遞,$amount就是值傳遞。

 

return可以退出函數的執行。 也可以用return來從函數中返回一個值。

function larger($x, $y){

  if ($x >= $y) return $x; 

  else return $y;

}

 

php支援遞迴函式。

 

 

第六章 物件導向的php

一個基本的php類:

class classname

{

  function __construct($param)  //建構函式

  {

    echo "Constructor called with parameter $param <br />";

  }

  function __destruct()     //解構函式

  {

    echo "Destruct";

  }

  function operation($att){ //普通成員函數

    $this->attribute = $att;

  }   

  var $attribute;     //普通成員變數

 

  //取類屬性的值,可以通過__get和__Set函數

  function __get($name)   //$name參數指定屬性的名稱,在這個類裡面應該是$attribute

  {

    return $this->$name;

  }

  function __set($name, $value) //$value是被設定的值

  {

    this->$name = $value;

  }

}

使用如下:

$a = new classname();

$a->$attribute = 5; //這句話,會間接的調用__set()函數

$a->$attribute; //會間接調用__get()函數

通過__get()、__set()是為了提供使其只有一個訪問入口,這樣就可以實現對要存取的資料進行檢查,保證資料是有意義的。

 

在php5中也引用了存取修飾詞,可以使用private和public及protected關鍵字控制訪問。

預設的存取修飾詞是public。

class classname

{

  public $attribute;

  public function __get($name){/**/}

}

 

實現繼承:

class A{

  var $attr1;

  function oper1(){}

}

class B extends A{

  var $attr2;

  function oper2(){}

}

B的對象也可以訪問$attr1和oper1();

在繼承中,通過使用private和protected來控制可見度。

如果A的oper1()是private的,則在B中無法訪問。protected和public都可以(與C++一樣)

 

php中的"重載“其實就是C++中的覆蓋,子類函數名與父類函數名相同,且將父類的同名函數隱藏掉。

php5中引入的final關鍵字可以禁止繼承和重載。

class A{

  final function opera(){}

}

則opera()函數在子類中不能被重載。

 

php不支援多重繼承,不過支援介面。

interface Displayable

{

  function display();

}

class WebPage implements Displayable

{

  function display(){ /*實現代碼*/ }

}

 

在業務繁忙的網站中,處理速度是很重要的,應該盡量使用靜態html網頁,或者儘可能緩衝指令碼輸出,從而減少在伺服器上的載入操作。

 

在php4中,對象是按值傳遞的,但在php5中是按引用傳遞的。

以前的php版本無法間接引用由函數返回的對象,如:select()->display();

php5中引用了Per-Class常量,可以在不需要初始化類的情況下使用。

class Math {

  const pi = 3.14;

}

可以直接這樣使用 Math::pi。

php5也引入了static關鍵字,它允許在未初始化類的情況下,就可以調用的類方法。(在靜態方法中不能使用this關鍵字)

php5提供了instanceof關鍵字和類型提示的概念。

php5引入了clone關鍵字,允許複製一個已有的對象。 $c = clone $b;

在基類中建立__clone()方法,可以自訂複製行為,而不使用預設的。

php5中也引入了“抽象類別”和“抽象方法”。

包含抽象方法的任何類自身都必須是抽象的。

abstract class A {

  abstract function operationX($param);

}

 

重載__call()方法,可以實現方法的重載。

public function __call($method, $p)

{

  if ($method == 'display') {if (...) else if (...)}

}

可以實現在調用 display方法時,根據call的實現,調用不同的函數。

 

__autoload()方法,是一個單獨的函數,它用來執行個體化一個還沒有被聲明的類時自動載入"類名.php"檔案。

 

代器和迭代

可以使用foreach()方法通過迴圈方式取出一個對象的所有屬性,就像數組方式一樣。(引擎會預設產生)

但如果需要更複雜的功能的話,則只能通過實現一個迭代器的方式。

 

__toString()函數可以將類轉換成字串,echo類時,會顯示相應的字串。

 

反射API:

$varcls = new ReflectionClass('Page');  //Page是個類名

echo $varcls; //就可以列印出Page類的資訊

 

 

第七章 異常處理

PHP中,異常必須手動拋出。

throw 異常類;

如可以拋出內建的Exception類:throw new Exception('message', code);

在外部用catch來捕獲。

 

Exception類提供了很多內建方法:

getCode()--返回傳遞給建構函式的代碼。

getMessage()--返回傳遞給建構函式的訊息。

getFile()--返回產生異常的代碼檔案的完整路徑。

getLine()、getTrace()、getTraceAsString()、_toString等等……

 

也可以拋出自訂的任何類對象,不過一般情況下都會使自訂的異常類從Exception中繼承。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.