編程界不論是PHP、Python都有這麼兩種編程思想,oop面向對象、pop面向過程,這兩種在功能上沒有多大區別,但是在代碼編寫上卻有很大區別。今天就記錄一下麵向對象和麵向過程的優點、缺點、定義、實現過程。 oop 面向對象 面向對象有兩個重要的概念:類和對象。 什麼是類?類是具備某項功能的抽象模型 ...
編程界不論是PHP、Python都有這麼兩種編程思想,oop面向對象、pop面向過程,這兩種在功能上沒有多大區別,但是在代碼編寫上卻有很大區別。今天就記錄一下麵向對象和麵向過程的優點、缺點、定義、實現過程。
- oop 面向對象
面向對象有兩個重要的概念:類和對象。
什麼是類?類是具備某項功能的抽象模型,在應用當中類需要實例化也就是new之後使用,這個時候就引出了對象。
什麼是對象?對象是類實例化之後的一個產物,是一個實體。
面向對象的3個基礎特征:
- 封裝
把客觀事物封裝成一個類,通過修飾符改變屬性或函數的訪問許可權達到保護作用
- 繼承
子類繼承父類,可以使用父類的公共屬性和方法,可以實現介面,同時實現介面里的所有方法
- 多態
覆蓋和重載,子類繼承父類,子類可以覆蓋父類中的方法。一個類中可以同時擁有同一個函數名的方法,但是方法的參數不同,實現結果也不同。
面向對象的幾個名詞:類、對象、屬性、方法、實例化。
面向對象優點:可擴展性高,可復用,易維護
面向對象缺點:編程複雜度高,性能比面向過程低(需要實例化類)
來一段簡單的代碼demo:
1 <?php 2 3 /** 4 * 面向對象 5 * 兩個重要概念 6 * class app 就是一個類 7 */ 8 class oop { 9 10 /** 11 * 面向對象三大特征 12 * 封裝 把客觀事物封裝成一個類,通過修飾符改變類的屬性、函數的訪問許可權,達到保護作用 13 * private 私有成員 public 公共 protected 保護成員 14 */ 15 public $name = '名字'; 16 public $sex = [ 17 '男', '女' 18 ]; 19 private $eag = 30; 20 protected $job = '女公關'; 21 22 public function dump() { 23 echo $this->name; 24 } 25 26 } 27 28 /** 29 * 面向對象三大特征 30 * 繼承 子類繼承父類 子類可以使用父類的公共屬性和方法 31 */ 32 class oop1 extends oop { 33 34 public function dump1() { 35 var_dump($this->sex); 36 } 37 38 /** 39 * 面向對象三大特征 40 * 多態 覆蓋和重載 子類繼承父類 子類可以覆蓋父類的方法,一個類里可以存在用一個函數名方法,但是參數不一樣,結果也不一樣 41 */ 42 public function dump() { 43 echo __CLASS__ . '覆蓋了父級' . __FUNCTION__ . '的結果'; 44 echo '<br>'; 45 } 46 47 } 48 49 /** 50 * 面向對象三大特征 51 * 繼承 子類繼承父類 子類可以使用父類的公共屬性和方法 52 */ 53 class oop2 extends oop { 54 55 /** 56 * 面向對象三大特征 57 * 多態 覆蓋和重載 子類繼承父類 子類可以覆蓋父類的方法,一個類里可以存在同一個函數名的方法,但是參數不一樣,結果也不一樣 58 */ 59 public function dump() { 60 echo __CLASS__ . '覆蓋了父級' . __FUNCTION__ . '的結果'; 61 echo '<br>'; 62 } 63 64 } 65 66 //類是具備某項功能的抽象模型,實際應用中要先實例化(new)後使用,以下就是實例化類,列印$class看到的結果就是對象 67 $class = new oop(); 68 //object(oop)#1 (2) { ["name"]=> string(6) "名字" ["sex"]=> array(2) { [0]=> string(3) "男" [1]=> string(3) "女" } } 69 var_dump($class); 70 echo '<br>'; 71 //實例化之後就可以調用公共屬性(變數) 72 $name = $class->name; 73 var_dump($name); 74 echo '<br>'; 75 //實例化之後就可以調用公共函數(方法) 76 $class->dump(); 77 echo '<br>'; 78 $class1 = new oop1(); 79 var_dump($class1); 80 echo '<br>'; 81 $class1->dump1(); 82 echo '<br>'; 83 $class1->dump(); 84 $class2 = new oop2(); 85 var_dump($class2); 86 echo '<br>'; 87 $class2->dump();
執行結果:
- pop 面向過程
面向過程的代碼執行是從上到下(從前到後),有一個個函數去實現步驟,使用的時候需要一個一個依次調用。
面向過程優點:性能比面向對象高(不用去實例化類),將複雜的問題流程化,進而簡單化。
面向過程缺點:不易維護,可擴展性不高。
代碼片段:
1 <?php 2 3 /** 4 * 面向過程的資料庫連接方式 5 */ 6 7 8 function db($cnf) { 9 10 $config = [ 11 'host' => 'localhost', 12 'username' => 'root', 13 'password' => 'root', 14 'databases' => '', 15 'port' => 3306, 16 'conding' => 'utf8' 17 ]; 18 19 $rows = array(); 20 21 if(isset($cnf) && is_array($cnf)) { 22 $config = array_merge($config, $cnf); 23 } 24 $link = mysqli_connect($config['host'], $config['username'], $config['password'], $config['databases'], $config['port']); 25 if(mysqli_connect_errno($link)) { 26 die('MySQL資料庫連接失敗,錯誤代碼ERROR:' . mysqli_connect_errno()); 27 } 28 // if(!$config['databases']) { 29 // $conding = $config['conding']; 30 // mysqli_query("SET NAMES '{$condig}'", $link); 31 // mysqli_select_db($config['databases'], $link); 32 // } 33 $sql = 'select * from niuniu_user limit 1'; 34 $query = mysqli_query($link, $sql); 35 $row = mysqli_fetch_array($query, MYSQLI_ASSOC); 36 if(mysqli_num_rows($query) > 1) { 37 while($row) { 38 $rows[] = $row; 39 } 40 } else { 41 $rows = $row; 42 } 43 44 var_dump($rows); 45 46 mysqli_close($link); 47 } 48 49 50 echo '面向過程的資料庫連接方式<br>'; 51 52 $cnf = [ 53 'host' => '172.17.0.2', 54 'username' => 'root', 55 'password' => 'cuiyuanxin66666', 56 'databases' => 'nndb' 57 ]; 58 59 db($cnf);
源代碼已上傳GitHub:https://github.com/cuiyuanxin/php-demo
純手打筆記,如有錯誤請評論提出,謝謝。