PHP面向对象和面向过程

编程界不论是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();

 

执行结果:

 

PHP面向对象和面向过程

  •  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

纯手打笔记,如有错误请评论提出,谢谢。

 

 

posted @ 2019-02-23 17:44  崔元欣  阅读(3544)  评论(0编辑  收藏  举报