PHP面向对象编程(一)
本文章为连载文章,鉴于大家都有点基础,所以直接深入讲解
如果第一次接触PHP的同学,请从看起
面向对象编程思想介绍
面向过程编程:
其基本特征是:
将要完成的任务,分割为若干个步骤:
第1步:做什么。。。
第2步:做什么。。。
…….
最后,做完了,任务完成!
图示:
面向对象编程:
其基本特征是:
将要完成的任务,“分派”给不同的“对象”去做;
某对象1:会做什么。。。
某对象2:会做什么。。。
……..
程序一旦启动,则各个对象“各司其职”,相互配合就完成了任务。
图示:
OOP: Object Oriented Program(面向对象编程)
面向对象中的基本概念
类和对象
对象: 万物皆对象;
类: 任何对象,都可以人为“规定”为某种类型(类别);
class Person{
var $name ;
var $age;
var $edu;
}
我:
姓名:罗XX,
年龄40,
学历:大学;
王亮:
姓名:王亮
年龄:20;
学历:大学;
class Teacher{
var $name ;
var $age;
var $edu;
var $major; //专业
}
举例:
显示结果为:
然后再显示为:
可见:
类是描述一类事物的一个总称,是具有相同特征特性的该类事物的一个通用名字(称呼);
对象是一个明确的具体的“物体”,是某个类中的一个“实物”(相对来说,类就是一种抽象的泛称)。对象离不开类,或者说,对象一定隶属于某个类——有类才有对象,先有类再有对象。
属性和方法
原来的做法(面向过程):
现在的做法(面向对象):
可见:
属性:就是原来的“变量”,只是现在它“隶属于”一个类了,即写在一个类中,就称为属性;
方法:就是原来的“函数”,只是现在它“隶属于”一个类了,即写在一个类中,就称为方法;
注意:属性和方法,已经不能“自由使用”了,而是都要通过这个类或这个类的对象去使用。
使用属性,就把它当做一个“变量”去使用就好了,只是需要该形式:对象->属性名;
使用方法,就把它当做一个“函数”去使用就好了,只是需要该形式:对象->函数名(实参列表…)
结果为:v1=25
一个类,定义了一些属性和方法,则:
这个类所创建出来的对象,也就自然有了这些属性和方法;
创建对象的几种形式
class C1{
var $p1 = 1; //定义一个属性;
}
形式1:
$o1 = new C1(); //通过一个类,去new出一个对象
形式2:
$o2 = new $o1(); //通过一个对象,去new出一个对象——其实是new出来的是旧对象所述类的一个新对象。
形式3:
$s1 = “C1”; //只是一个字符串变量而已;
$o3 = new $s1(); //这就是所谓的“可变类”——无非就是类的名字是一个变量而已。
形式4:
$o4 = new self(); //self表示“当前类本身”,它只能出现在一个类的方法中。
对象的传值方式:
类中成员
类中成员概述
面向对象编程,是需要通过“对象”去做什么事情(以完成某种任务);
而:
对象总是来源于类;
所以:
面向对象的编程,一切都是从定义类开始;
类中成员分为3大类:
属性:
方法:
常量:
形式上,大致如下:
class 类名 {
常量定义1;
常量定义2;
…….
属性定义1;
属性定义2;
……..
方法定义1;
方法定义2;
…….
}
说明:
以上各项,没有顺序问题;习惯上,其实常量放前面,然后是属性,然后是方法;
详细一点,就又分为:
属性:
普通属性;//一般属性,实例属性
静态属性;
方法:
普通方法;//一般方法,实例方法
静态方法;
构造方法;
析构方法;
常量:
类常量
当在一个类中定义一个常量时,该常量就称为“类常量”——本质其实还是常量;
定义形式:
class 类名{
const 常量名 = 常量值;
//不可以使用define()来定义!
}
使用形式:
常量的使用,是通过类名,并使用范围解析符(::)来取用的;
类名::常量名;
举例:
普通属性(实例属性):
实例的单词为:instance
实例,其实也叫做“对象”;
普通(实例)属性,就是一个可以在该类实例化出的对象上使用的属性!
定义形式:
class 类名{
var $属性名 = 初始值;
var $属性名; //这个属性没有初始值;
//上述的var 还可以使用public来代替,比如:
public $属性名 = 初始值;
public $属性名; //这个属性没有初始值;
}
使用形式:
是通过该类的对象,来使用普通属性(实例属性):
$对象->属性名;
因为,属性的本质就是变量,则其就可以当做一个变量来看待和使用,比如:
$v1 = $对象->属性名;
echo $对象->属性名;
$v2 = $对象->属性名 * 3 + 5; //进行计算
静态属性:
静态属性,本质上也是“变量”,但其有一个特点就是:该变量只隶属于“类”,即:
一个类中的一个静态属性,就只有“一份数据”;
但:
一个类中的一个实例属性,就可以有“多份数据”——每创建一个对象出来,就会有一份数据;
定义形式:
class 类名{
static $属性名 = 初始值;
static $属性名; //这个属性没有初始值;
}
使用形式:
使用类名和范围解析符(::)来对静态属性进行操作:
类名::$静态属性名; //注意:属性名带$符号
对比1:
常量的使用:类名::常量名;
对比2:
实例属性的使用:对象名->实例属性名; //注意:属性名不带$符号
结果为:
可见:
1,实例属性,是每个对象都可以不一样的数据,也是每个对象都“独自拥有”的数据;
2,静态属性,他不属于任何一个对象,而只属于该类本身,也可以理解为为所有对象所共有的数据;
普通方法(实例方法)
一个类中定义的方法,可以为这个类的所有对象调用的方法。也可以理解为,这个类的所有对象,都各自有自己的一个该方法;
定义形式:
class 类名{
function 方法名(形参1,形参2,…. ){
//方法体。。。
}
}
调用形式:
$对象名->方法名(实参1,实参2,….);
静态方法
一个类中定义的方法,只隶属于这个类本身,而不是隶属于这个类的对象。
定义形式:
class 类名{
static function 方法名(形参1,形参2,…. ){
//方法体。。。
}
}
调用形式:
类名::方法名(实参1,实参2,….);
举例(属性和方法的综合例子)
构造方法(_ _construct):
构造方法,是一个特殊的方法:
1,名字是固定的:_ _construct;
2,该方法通常都不要我们自己调用,而是在new一个对象的时候会自动调用。
3,该方法主要的目的是为了在new一个对象的时候,给该对象设置一些“初始值”(初始化工作);
4,构造方法的参数没有规定,通常是根据实际的需要来定义,目的是为了对象属性数据的初始化;
先看这种没有构造方法的情形:
可见,这种方式,对对象的属性的数据值初始化不太方便,我们可以利用构造方法改进为:
析构方法(_ _destruct):
说明:
1,析构方法是一个特殊的方法,名字为固定的词:_ _desctruct
2,析构方法是在一个对象被“销毁”的时候会自动被调用的方法——我们无法调用它;
3,析构方法不能带参数(形参),但方法中也可以使用$this这个词,代表“当前对象”;
对象在哪些情况下会被销毁?
1,如果程序结束,所有变量都会被销毁,自然,变量所代表的对象也会被销毁;
可见,对象销毁的顺序,默认情况下,跟其创建的顺序相反;
2,当一个对象没有任何变量“指向”它的时候,即使程序还没有结束,也会被销毁;
如下图所示:
另一个情况:
图示如下:
再来一个情况:
图示如下:
最后一个情况:
图示如下:
开始,其原理为:
赋值之后($o4 = 44),其结果及原理为:
原理$o4中存储的数据是new过来:$o4 = new C1(“D”);
更多课程请搜索微信公众号“爱搞机个人版”,喜欢学习的建议关注下,所有课程免费! 点下关注不迷路!
PHP8的类与对象的基本操作之类的实例化-PHP8知识详解
定义完类和方法后,并不是真正创建一个对象。类和对象可以描述为如下关系。类用来描述具有相同数据结构和特征的“一组对象”,“类”是“对象”的抽象,而“对象”是“类”的具体实例,即一个类中的对象具有相同的“型”,但其中每个对象却具有各不相同的“值”。
例如,人就是一个抽象概念,即人类,但是程序员小张就是人类中具体的一个实例,即对象。
类的实例化的语法格式如下:
其中,new为创建对象的关键字,“$变量名”返回对象的名称,用于引用类中的方法。参数是可选的,如果存在参数,则用于指定类的构造方法初始化对象使用的值,如果没有定义构造函数参数,php会自动创建一个不带参数的默认构造函数。
类实例化就产生了对象,然后通过如下格式就能调用要使用的方法:
创建对象并调用方法参考代码:
本案例以book类为例,实例化一个对象并调用textbook()方法。
以上代码在PHP8中的运行结果如下:
上面的例子实例化了两个对象,并且这两个对象之间没有任何联系,只能说明是源于同一个类。可见,一个类可以实例化多个对象,每个对象都是独立存在的。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。