1. 程式人生 > >PHP面向對象和面向過程

PHP面向對象和面向過程

block 權限 復用 使用 今天 功能 什麽 python 有一個

編程界不論是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

純手打筆記,如有錯誤請評論提出,謝謝。

PHP面向對象和面向過程