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();
执行结果:
- 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
纯手打笔记,如有错误请评论提出,谢谢。
上一篇: 使用java发送QQ邮件的总结
下一篇: 程序员奇谈之我写的程序不可能有bug篇