用拟物化方式理解PHP实例化对象和$this关键字
在拟物化的方式来讲解PHP实例化对象及其 $this
关键字之前,让我们首先设定一个现实生活中的场景。假设我们有一个“书桌”制造商,他们有一份详尽的设计图纸,这份图纸定义了书桌应有的各种属性(如颜色、尺寸、材料)和功能(如打开抽屉、调整桌面高度)。
PHP实例化对象的目的和意义
在PHP编程中,类就像那份设计图纸,它描述了一个“书桌”应该具有的所有特性和行为。比如,我们可能定义一个名为“Desk”的类:
class Desk
{
public $color;
public $size;
protected $drawers = array();
public function __construct($color, $size)
{
$this->color = $color;
$this->size = $size;
}
public function openDrawer($drawerNumber)
{
// 打开指定编号的抽屉的逻辑
}
public function adjustHeight($height)
{
// 调整桌面高度的逻辑
}
}
在这个类中,“颜色”和“尺寸”是属性,而“openDrawer”和“adjustHeight”是方法。
实例化对象
现在,实例化一个“Desk”对象就如同按照设计图纸制造一张真实的书桌。在PHP中,我们这样操作:
$myDesk = new Desk('brown', 'large');
这里的 $myDesk
就是我们基于“Desk”类创建的具体书桌实例,它有自己的颜色(棕色)和尺寸(大)。这就如同工厂根据图纸生产出了具有特定配置的实体书桌。
继续沿用之前的“书桌”比喻,多个实例化相同对象的意义在于能够创建并管理不同状态或需求的多个独立实体。
假设我们的家具店不仅需要一张棕色大号书桌,还需要一张白色小号书桌用于展示不同的空间布局方案。在PHP中,我们可以再次使用"Desk"类来创建另一个实例:
$displayDesk = new Desk('white', 'small');
此时,我们就有了两个不同的书桌实例——$myDesk
和 $displayDesk
。尽管它们都是基于同一个“Desk”类创建的,但各自的状态是独立的:
$myDesk
可能是办公区使用的棕色大号书桌;$displayDesk
则可能是展厅里的白色小号书桌。
这意味着对 $myDesk
的任何操作(比如改变颜色或调整高度),都不会影响到 $displayDesk
。这就是多态性的体现,也是面向对象编程的重要优势之一,即通过复用类模板来高效地创建和管理大量相似但具体状态各异的对象实例。
总结来说,多个实例化相同对象的意义在于:
- 复用代码结构:避免重复编写类似的类,提高开发效率与代码组织性。
- 独立维护状态:每个实例都有自己的一套属性值,互不影响,适用于处理多样化的业务场景。
- 模拟真实世界:符合现实世界中存在多个同类实体且各有不同属性和行为的特点。
$this关键字
在上述类的方法内部,$this
关键字扮演的角色就像是一个指向当前正在操作的书桌实例的指针。例如,在 __construct
构造方法里,$this->color
和 $this->size
就分别代表新制作出来的书桌的颜色和尺寸。同样地,在 openDrawer
方法中,$this
指向的就是调用该方法的书桌实例,使得方法可以访问和修改该实例的属性或执行相应动作。**
所以,当你实例化对象后,$this
关键字在每个实例方法内都会绑定到相应的实例上,允许你访问和操作实例的属性以及调用实例的方法,就如同在现实生活中可以直接操作实物书桌一样。
PHP实例化对象:
每次执行包含对象实例化代码的PHP文件时,如果该文件中的代码逻辑按照正常流程执行到了实例化对象的部分,那么确实会执行一次对象的实例化操作。这意味着每次执行文件时,都会创建一个新的对象实例。每个对象实例具有独立的非静态属性值,这些值在对象创建时被初始化,并随着对象的使用和方法的调用可能发生变化。但请注意,每次脚本执行结束时,所有对象实例及其非静态属性值都将被释放,不会保留到下一次脚本执行。
静态变量:
静态变量与对象实例化行为没有直接关联。静态变量存在于函数或方法内部,并通过 static
关键字声明。静态变量的特点是其值能够在函数或方法被多次调用时得到保留,而不是每次调用时都被重新初始化。只要函数或方法所在的脚本还在执行过程中(即同一个请求/脚本生命周期内),静态变量的值就会被保留。然而,当脚本执行完毕,所有静态变量的值都会被释放,不会保留到下一次脚本执行。
综上所述:
- 每次执行包含对象实例化代码的PHP文件时,确实会执行一次对象实例化操作,生成一个新的对象实例。
- 静态变量在同一个脚本执行期间会保留其值,但不会跨越脚本执行的边界。换句话说,每次执行文件时,静态变量会在该次执行的初期被初始化(如果有初始值的话),并在脚本执行过程中保持其值,直至脚本结束。下一次执行文件时,静态变量将重新初始化,不会保留上一次执行时的值。