面向对象简单理解(一)

1.面向对象相关概念

  编程思想有两个大类

  1. 面向过程思想
  2. 面向对象思想

面向过程思想介绍

分析以下两个场景,

QA 梁同学吃早餐 苏同学要买手机
步骤 起床 分析需求(打电话、上微信、上抖音,吃鸡……)
刷牙 查资料(配置/性能、应用场景)
洗脸 购买方式(线上网购/线下实体店)
穿衣服 穿衣服
穿鞋 穿鞋
出门 出门
(省略可能的动作。。) (省略可能的动作。。)
吃早餐 买到手机

结论先行

面向过程思想是面向整个过程,强调的是过程中每一步的动作

分析
  面向过程其实是人类最为实际的一种思考方法,我要达解决某件事或达到某种目的,然后拆分那些步骤是必要的,强调的是这个过程中的必要步骤中的动作。它更多的是考虑如何实际地实现。
  一般的面向过程都是从上往下按顺序(流程化)执行。这里也体现了面向过程一种优势,通过拆分事件,分析步骤,按着模块化与相关辅助函数可以很好地组织达到想要的效果。
  所以面向过程最重要的是模块化的思想方法

面向对象思想介绍

  同样是以上相同的两个场景,使用面向对象的方式来解决最终的问题:

面向对象思想解决 面向对象思想解决
点外卖不就得了? 买手机?稳轩哥!(专注手机20年)

结论先行
  面向对象思想,面向的是一个对象,强调的是最终的结果

面向过程思想的局限性

  1. 使用面向过程思想开发,代码冗余量高,复用性低
  2. 使用面向过程思想开发,如果中途需求发生改变,那么代码的改动量非常庞大

冗余代码主要分两部分:多余执行的冗余和代码数量的冗余。
复用性:例如A功能写成一个模块,以便再次需要相同功能时,可以直接引用而不是重复开发。

正是由于这些局限性,所以人们慢慢过渡到使用面向对象的方式进行开发,解决上述局限性的问题

题外:

  遵循DRY原则(don’t repeat yourself)避免重复代码原则

什么是面向对象:找个对象帮我做事情(结果)

  面向对象即OOP(Object oriented Programming)
  概念:以面向对象思想为指导的一种编程方式
  联想:laravel中的控制器依赖注入完美体现OOP思想。(得整理)

2.PHP中的类与对象

  程序本质就是对现实世界的模拟
  类是一个比较抽象的概念,好比如人类,猫类,鱼类,车类等等,它本质是描述事物具有相同的特征的统称

现实中类的概念:具有相同【特征】和【行为】的一类群体统称
PHP中类的概念:具有相同【属性】和【方法】的一类事物的集合

<?php 
//定义一个类
class 类名{
    类成员(属性、方法)
}

类成员

  类成员包括三个大类,五个小类

这里写图片描述

  定义一个完整的包含类成员的类;

<?php
//定义一个类
class student{
    //成员属性:静态属性和非静态属性
    public static $fee;
    public $name;
    //成员方法:静态方法和非静态方法
    public static function fee() 
    {
      return xxxxxxxx;
    } 
    public function attr()
    {
      return xxxxxxx;
    }

}

对象

  PHP中,对象需要基于类的定义创建出来

//PHP创建语法如下
//需要先定义个类
class student{
    类成员(属性/方法)
}
//然后基于类的定义创建出来
$obj=new student;

关于类与对象的关系

  类是抽象的,而对象是具体的。类是对象的模版,而对象是类的个体实例

  举个例子:例如女娲泥巴造人,创造一个“人”的时候,需要定义“人”类拥有哪些属性,于是在【模版】上添加了头、手、脚、身等。而造“人”的时候,往磨具中添加的“泥巴”含量大小不同,造就了“人”与“人”之间的差别。

对象创建的原理图

创建原理图
这里写图片描述

类的成员/方法/常量定义

~访问修饰符 [static] $变量;
~访问修饰符 [static] 方法
~CONST 大写英文

#假设已定义好一个类以及相关属性~在外部访问
//统一需要为类实例化一个对象
$obj=new A;
//非静态
dump($obj->成员属性);
//静态
dump(类名::$变量名)  

~~~懒了

类成员的调用

总结

  1. 在类的外部,非静态的属性需要先实例化一个对象,然后用这个对象加上 -> 来访问指定的属性名(不知可否理解为一个指针,指针类中的属性)
  2. 在类的外部,静态的属性直接使用类名加上 :: (范围解析操作符)来访问指定的静态属性,注意需要+上$符。因为静态的成员属性/方法是属于整个类的,可简单理解静态变量为共享变量

3.静态是属于类的,而非静态是属于对象的
关于框架中的静态方法,静态方法通常是需要经常用到的。例如laravel中的orm,通过模型映射数据表类,每个数据表都要基本的增删改查,所以集成了基本的需求, 模型::save()等一系列方法。

对象的比较

//还是创建对象原理图有没吃透的问题~有空再总结
<?php

class A{

    public $name='Jason';
}

$obj1 = new Person;
var_dump( $obj1 ); echo '<br/>';  //object(A)#1(1){['name']=>string(5)"Jason"} $ojb1中的内容

$obj2 = new Person;
var_dump( $obj2 ); echo '<hr/>';  //object(A)#1(2){['name']=>string(5)"Jason"} $ojb2中的内容

var_dump( $obj1==$obj2 ); echo '<hr/>'; //bool(true)
var_dump( $obj1===$obj2 );              //bool(false)

self关键字

  self在内部作用是代替本类的类名
  例如需求变动,原本的类中需要调动类中静态方法,如果默认调用静态方法前缀均为self时,则省下很多功夫。如果是普通IDE,修改框架中的类名时,需要查找变动影响的相关问题

构造方法

  需求:我要实例化两个学生对象,成员属性有名字和身高。
  如果不使用构造方法,那么每次实例化对象时,都要通过 ->设置相关属性值。而使用__construct则可解决这个问题,不用每次都手动赋值,提高工作效率。

  1. 构造方法名 需要是 __construct
  2. php不负责定义构造方法,只负责调用构造方法
  3. php调用构造方法的时机:当使用new关键字实例化一个对象时,那么构造方法将会被php自动调用

析构方法

  1. 使用unset销毁掉保存对象的变量
  2. 什么都不做,程序执行结束时也将会自动销毁保存对象的变量;

    析构方法的特点
    1.PHP不负责定义析构方法,只负责调用析构方法;
    2.PHP调用析构方法的时机是:当一个对象死亡的时候,那么析构方法将会被PHP自动调用执行;

对象的传值:引用传递与值传递

一看到new对象,马上联想到已经堆区开辟好一个空间等待赋值。在栈区中,该对象的地址指向堆区的地址。本质上对象是一个地址,引用堆区保存对象的地方

  1. 对象引用传递:引用的是这个对象的地址
  2. 对象的值传递:拷贝的也是对象的地址

    这里写图片描述

随笔

  • 没有理清return的含义。想实例化对象时初始化参数,但在构造方法中设置了return t h i s > = 变量。相当于余下的代码不执行直接跳出了……
  • 调用非静态变量,经常使用 t h i s > 变量。。不应出现$符号
  • 关于类中方法创建属性的调用。方法创建时,相当于在栈区开辟一个新的空间,栈区之间相互独立,互不影响。假设有一个非静态成员属性 public age=12; 如果在方法中想调用age,需要使用 t h i s > a g e 使 age则会被定义为 undefined variables。
  • 在类的内/外部调用CONST,使用类名::常量名(果然没实战过永远不知道自己会犯下多么愚蠢的错误)
  • 习惯用phpstorm一段时间,再用其他没有提示语法错误的ide,简直爽呆了!语法错误层出不断!有趣。
  • 出现unexcept,先找提示错误的关键字有没错误,其次找到当行语法检查,再次往上寻找是否有语法错误。寻找过程中可通过注释部分代码,缩小错误范围

猜你喜欢

转载自blog.csdn.net/zgy0777/article/details/82118981