首页 >后端开发 >php教程 >PHP OOP 部分静态属性、方法以及 this 与 self

PHP OOP 部分静态属性、方法以及 this 与 self

Patricia Arquette
Patricia Arquette原创
2025-01-04 16:36:41647浏览

PHP OOP Part-Static property, method and this vs self

在本系列中,我将介绍 PHP 面向对象编程 (OOP) 的基础知识。内容将被组织成连续的部分,每个部分都侧重于一个特定的主题。如果您是初学者或不熟悉 OOP 概念,本系列旨在逐步指导您。 在这一部分,我将讨论 PHP 中的静态属性、方法以及 this 与 self。让我们一起开始学习PHP OOP的旅程吧!

什么是属性和方法?

首先,让我们尝试理解属性和方法。当我们使用一个类创建多个对象时,每个对象都会分配一个单独的内存位置。结果,该对象的所有属性和方法也被分配到该特定的内存位置。

这意味着当我们更改对象的任何属性时,更改仅限于该特定对象。它不会影响任何其他对象,因为类的属性和方法与该类的相应对象相关联。

要从类外部访问这些属性或方法,我们需要创建该类的对象。但是,如果我们想访问类内的这些属性或方法,我们可以使用 $this 关键字。 $this 关键字表示该类的当前对象。稍后我们将详细了解 $this 关键字。让我们看下面的例子:

代码示例

class Car
{
   public $name;
   public $color;

   function __construct(string $name, string $color)
   {
      $this->name  = $name;
      $this->color = $color;
   }

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

在此示例中,我们可以看到,为了访问类的属性,我们在同一类的方法中使用了 $this 关键字。同样,为了从外部使用此类的任何方法,我们创建了该类的一个对象。这就是我们通常使用类的普通属性或方法的方式。

什么是静态属性和静态方法?

但是,静态属性或方法的工作方式有所不同。当我们定义一个类时,它只分配一次内存位置。类似地,当我们在类中定义静态属性或方法时,它们也会与类本身一起分配到特定的内存位置,但只分配一次。

因此,如果我们稍后修改任何静态属性或方法,更改将反映在该类的所有实例中。换句话说,无论在哪里使用静态属性或方法,它的更新值都将可用。

如果我们想从类外部访问静态属性或方法,我们可以使用::(范围解析运算符)而不创建对象。或者,我们也可以在创建对象后访问它们。要从类内部访问它们,我们可以使用 self 关键字或类名本身。这里,self关键字代表类。

稍后我们将更详细地探讨 self 关键字。让我们看下面的例子:

代码示例

class Car
{
   public $name;
   public $color;

   function __construct(string $name, string $color)
   {
      $this->name  = $name;
      $this->color = $color;
   }

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

在此示例中,我们可以看到,为了访问类的静态属性,我们在同一类的方法中使用了 self 关键字。此外,为了使用类外部的静态方法,我们创建了该类的一个对象。但是,我们也可以使用类名和 ::(范围解析运算符)直接访问它,而无需创建对象。这就是我们通常使用类的静态属性或方法的方式。

在上面的示例中,我们可以看到,使用 Car 类,我们创建了两个具有不同数据的对象:$toyota 和 $bmw。现在我们要访问这些对象的值。如果我们运行上面的代码,我们将看到以下输出:

代码示例

class Car
{
   public static $name;
   public static $color;

   function __construct($name, $color)
   {
      self::$name = $name;
      self::$color = $color;
   }

   public static function getValue()
   {
      echo "Car name: " . self::$name . "\n";
      echo "Car color: " . self::$color . "\n";
   }
}

$toyota = new Car('Toyota', 'Black');
$bmw = new Car('BMW', 'Orange');

$toyota::getValue();
$bmw::getValue();

Car::getValue();

我们可以看到两个对象显示相同的值。换句话说,我们获取的值来自最近创建的对象。即使当我们尝试直接通过类访问值时,我们仍然得到相同的值,即第二个对象的值。

原因很清楚。如前所述,静态属性或方法是在单个内存位置中创建的。如果从任何地方更改静态属性或方法,则该更改会影响该类的所有实例。

在上面的示例中,当我们创建第二个对象时,属性值在对象创建后立即发生变化。此更改还影响了之前创建的对象,因为该类的所有对象共享相同的静态属性或方法。

重要的是要记住,类的静态属性或方法不能像普通类属性或方法一样使用。您不能使用 → 运算符来访问它们。相反,无论您是从类内部还是外部访问它们,您都必须使用 ::(范围解析运算符)。

$this 与 self 关键字

$这是什么?

我们已经看到了 $this 和 self 关键字的用法。现在,让我们更深入地研究这些概念,以更好地理解它们。

$this 是一个内置的 PHP 关键字。当我们使用类创建一个或多个对象时,可以使用类中的 $this 关键字访问类中定义的普通属性和方法。

现在,我们知道,当定义一个类时,它只会被分配到特定的内存位置一次。这可能会引发一个问题:如果我们从此类创建多个对象,$this 关键字是否只能对所有对象访问一次属性或方法?

答案是“不”。这是因为,正如我们已经讨论过的,$this 关键字并不代表类本身,而是代表该类创建的对象。换句话说,$this 与对象直接相关。因此,对于创建的每个对象,$this 关键字将分别访问每个对象的类的属性和方法。让我们看下面的例子:

class Car
{
   public $name;
   public $color;

   function __construct(string $name, string $color)
   {
      $this->name  = $name;
      $this->color = $color;
   }

   public function getValue()
   {
      echo "Car name: $this->name\n";
      echo "Car color: $this->color\n";
   }
}

$tesla = new Car('Zip', 'Blue');
$tesla->getValue();

在前面的例子中,我们多次使用了它,但是没有详细讨论$this的用法。现在我们对 $this 有了一些了解,我们可以更好地理解它的用法。使用这个类,我们创建了对象。现在,我们知道 $this 关键字分别访问每个对象的属性。

但是,需要注意的是,$this 关键字不能在静态方法中使用。为什么不能使用将很快解释。

self 关键字是什么?

我们已经知道,当一个类被定义时,它只会被分配到一个内存位置一次。同样,该类中的所有静态属性和方法也与该类一起分配到内存位置,仅一次。

因此,当我们使用此类创建对象时,不会为每个对象单独创建静态属性或方法。这就是为什么我们无法使用 $this 关键字访问这些静态属性或方法。 $this 关键字代表类的对象,由于静态属性或方法不与任何对象相关,而是直接与类本身相关,因此无法使用 $this 访问它们。

要访问类中的静态属性或方法,我们使用 self 关键字或类名以及 ::(范围解析运算符)。这是因为 self 关键字代表类本身。让我们看下面的例子:

class Car
{
   public static $name;
   public static $color;

   function __construct($name, $color)
   {
      self::$name = $name;
      self::$color = $color;
   }

   public static function getValue()
   {
      echo "Car name: " . self::$name . "\n";
      echo "Car color: " . self::$color . "\n";
   }
}

$toyota = new Car('Toyota', 'Black');
$bmw = new Car('BMW', 'Orange');

$toyota::getValue();
$bmw::getValue();

Car::getValue();

在此示例中,我们看到我们可以使用类名或 self 关键字以及 ::scope 解析运算符轻松访问非静态方法中的静态成员,因为它们与类相关。因此,要访问它们,我们不需要创建单独的对象。

但是,如果我们想在静态方法中访问非静态成员,则需要使用 $this 关键字。但我们知道,静态方法中不能使用$this关键字,因为$this与对象相关,而非静态成员与对象无关。这就是我们不能在静态方法中使用 $this 关键字的原因。

但是,如果我们需要在静态方法中访问非静态成员,我们可以在静态方法中创建类的实例或对象,然后使用 $this 关键字来访问它们,如上例所示.

希望这能让您更清楚地了解 $this 和 self 关键字的用法。这就是今天的全部内容;我们下一课继续。

您可以在 GitHub 和 Linkedin 上与我联系。

以上是PHP OOP 部分静态属性、方法以及 this 与 self的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn