__construct()
(構造函數),在新對象被建立時會被自動調用;__destruct()
(析構函數)的魔術方法。在須要作類清理工做(例如,關閉數據庫鏈接)時它就很是有用。unset()
函數銷燬這個對象。MyClass
類輸出爲一個字符串而不發生錯誤,須要定義另外一個魔術方法__toString()
。若是沒有定義__toString()
方法就輸出對象會發生致命錯誤(程序中止運行)。在沒有定義__toString()
方法的狀況下用echo
指令輸出對象:<?php class MyClass { public $var = "MyClass"; public function __construct() { echo 'The class "',__CLASS__,'" was initialized!<br/>'; } public function __destruct() { echo 'The class "',__CLASS__,'" was destroyed!<br/>'; } public function __toString() { echo "Using the toString method: "; return __CLASS__; } } $myclass = new MyClass; var_dump($myclass); //直接打印類變量 echo $myclass; //調用__toString方法 unset($myclass);
parent
關鍵字加上做用域解析符(::)。public
protected
。若一個屬性或方法被聲明爲受保護的protected
,就只能在本類或者其後代(即繼承了包含受保護方法的類的那些類)內部訪問它。private
,就只能在定義它的類內訪問。這意味着,即使是子類,也不能訪問該屬性或方法。注意:在訪問靜態屬性時,美圓符號($)要放在做用域解析符(::)以後。如:self::$count
,MyClass::plusone()
,MyClass::$count
等。php
文檔塊使用塊註釋的開頭再多加一個星號的方式定義:jquery
/** * 這是一個最基本的文檔塊 * /
經常使用標籤:git
@author
@copyright
——當前元素的版權年份及版權方名字@license
——當前元素的受權文件連接@var
——變量或類屬性的類型和描述@param
——函數或方法的返回值類型及其描述。@return
——函數或方法的返回值類型及其描述。一個簡單的例子:github
<?php /** * * 一個簡單的類 * @author Sysublackbear * @copyright 2014 SYSU * @license http://sysublackbear.github.io * / class SimpleClass { /** * 一個公開變量 * * @var string 保存類的數據 */ public $foo; /** * 在類實例化時給$foo賦一個新值 * * @param string $var一個必須提供的值,供類初始化使用 * @return void * / public function __construct($val) { $this->foo = $val; } /** * 兩個整數相乘 * * 接受一對整數做爲參數,返回它們的積 * * @param int $bat一個數字 * @param int $baz一個數字 * @return int兩個參數的積 * / public function bar($bat,$baz) { return $bat*$baz; } } ?>
OOP的另外一個好處是它很是便於代碼打包和分類。每一個類一般都放入一個單獨的文件,若是採用統一的命令約定,訪問一個類就極其簡單。數據庫
假設你有一個程序有150個類,這些類由程序根目錄下的一個控制文件動態調用。全部這150個類文件都遵照一樣的命名約定:class.classname.inc.php
,而且這些文件都被放在你應用程序的inc目錄當中。數組
在這個控制文件中實現PHP的__autoload()
函數,就可以在某個類實例化時動態載入這個類,而沒必要爲了以防萬一在控制文件中包含全部150個類,或者本身費心勞力地想別的辦法來包含這些文件:函數
<?php function __autoload($class_name) { include_once('inc/class.'.$class_name.'.inc.php'; } ?>
把每一個類放到一個單獨的文件,這樣作很是有利於代碼的移植,同時也使代碼在新項目中重用更容易(無需大段複製粘貼代碼)。oop
只要運用得當,OOP天生具備簡潔緊湊的特色,與面向過程的代碼相比,面向對象的代碼定位和修改起來都很是容易。學習
若是某個信息數組增長了一個新的屬性,面向過程代碼可能須要修改每一個使用這個數組的函數(在最壞的狀況下),以便增長這個屬性。this
而面向對象的應用程序只須要添加新的屬性,再添加上處理這個屬性的方法,就能輕鬆地完成更新。