1.面向对象相关概念
编程思想有两个大类
- 面向过程思想
- 面向对象思想
面向过程思想介绍
分析以下两个场景,
QA | 梁同学吃早餐 | 苏同学要买手机 |
---|---|---|
步骤 | 起床 | 分析需求(打电话、上微信、上抖音,吃鸡……) |
刷牙 | 查资料(配置/性能、应用场景) | |
洗脸 | 购买方式(线上网购/线下实体店) | |
穿衣服 | 穿衣服 | |
穿鞋 | 穿鞋 | |
出门 | 出门 | |
(省略可能的动作。。) | (省略可能的动作。。) | |
吃早餐 | 买到手机 |
结论先行
面向过程思想是面向整个过程,强调的是过程中每一步的动作
分析
面向过程其实是人类最为实际的一种思考方法,我要达解决某件事或达到某种目的,然后拆分那些步骤是必要的,强调的是这个过程中的必要步骤中的动作。它更多的是考虑如何实际地实现。
一般的面向过程都是从上往下按顺序(流程化)执行。这里也体现了面向过程一种优势,通过拆分事件,分析步骤,按着模块化与相关辅助函数可以很好地组织达到想要的效果。
所以面向过程最重要的是模块化的思想方法。
面向对象思想介绍
同样是以上相同的两个场景,使用面向对象的方式来解决最终的问题:
面向对象思想解决 | 面向对象思想解决 |
---|---|
点外卖不就得了? | 买手机?稳轩哥!(专注手机20年) |
结论先行
面向对象思想,面向的是一个对象,强调的是最终的结果。
面向过程思想的局限性
- 使用面向过程思想开发,代码冗余量高,复用性低
- 使用面向过程思想开发,如果中途需求发生改变,那么代码的改动量非常庞大
冗余代码主要分两部分:多余执行的冗余和代码数量的冗余。
复用性:例如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(类名::$变量名)
~~~懒了
类成员的调用
总结
- 在类的外部,非静态的属性需要先实例化一个对象,然后用这个对象加上 -> 来访问指定的属性名(不知可否理解为一个指针,指针类中的属性)
- 在类的外部,静态的属性直接使用类名加上 :: (范围解析操作符)来访问指定的静态属性,注意需要+上$符。因为静态的成员属性/方法是属于整个类的,可简单理解静态变量为共享变量。
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则可解决这个问题,不用每次都手动赋值,提高工作效率。
- 构造方法名 需要是 __construct
- php不负责定义构造方法,只负责调用构造方法
- php调用构造方法的时机:当使用new关键字实例化一个对象时,那么构造方法将会被php自动调用
析构方法
- 使用unset销毁掉保存对象的变量
什么都不做,程序执行结束时也将会自动销毁保存对象的变量;
析构方法的特点
1.PHP不负责定义析构方法,只负责调用析构方法;
2.PHP调用析构方法的时机是:当一个对象死亡的时候,那么析构方法将会被PHP自动调用执行;
对象的传值:引用传递与值传递
一看到new对象,马上联想到已经堆区开辟好一个空间等待赋值。在栈区中,该对象的地址指向堆区的地址。本质上对象是一个地址,引用堆区保存对象的地方
- 对象引用传递:引用的是这个对象的地址
对象的值传递:拷贝的也是对象的地址
随笔
- 没有理清return的含义。想实例化对象时初始化参数,但在构造方法中设置了return 变量。相当于余下的代码不执行直接跳出了……
- 调用非静态变量,经常使用 变量。。不应出现$符号
- 关于类中方法创建属性的调用。方法创建时,相当于在栈区开辟一个新的空间,栈区之间相互独立,互不影响。假设有一个非静态成员属性 public age=12; 如果在方法中想调用age,需要使用 age则会被定义为 undefined variables。
- 在类的内/外部调用CONST,使用类名::常量名(果然没实战过永远不知道自己会犯下多么愚蠢的错误)
- 习惯用phpstorm一段时间,再用其他没有提示语法错误的ide,简直爽呆了!语法错误层出不断!有趣。
- 出现unexcept,先找提示错误的关键字有没错误,其次找到当行语法检查,再次往上寻找是否有语法错误。寻找过程中可通过注释部分代码,缩小错误范围