PHP OOP 部分静态属性、方法以及 this 与 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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

RESTAPI设计原则包括资源定义、URI设计、HTTP方法使用、状态码使用、版本控制和HATEOAS。1.资源应使用名词表示并保持层次结构。2.HTTP方法应符合其语义,如GET用于获取资源。3.状态码应正确使用,如404表示资源不存在。4.版本控制可通过URI或头部实现。5.HATEOAS通过响应中的链接引导客户端操作。

匿名类在PHP中的主要作用是创建一次性使用的对象。1.匿名类允许在代码中直接定义没有名字的类,适用于临时需求。2.它们可以继承类或实现接口,增加灵活性。3.使用时需注意性能和代码可读性,避免重复定义相同的匿名类。

在PHP中,异常处理通过try,catch,finally,和throw关键字实现。1)try块包围可能抛出异常的代码;2)catch块处理异常;3)finally块确保代码始终执行;4)throw用于手动抛出异常。这些机制帮助提升代码的健壮性和可维护性。

PHP中有四种主要错误类型:1.Notice:最轻微,不会中断程序,如访问未定义变量;2.Warning:比Notice严重,不会终止程序,如包含不存在文件;3.FatalError:最严重,会终止程序,如调用不存在函数;4.ParseError:语法错误,会阻止程序执行,如忘记添加结束标签。

在PHP中,include,require,include_once,require_once的区别在于:1)include产生警告并继续执行,2)require产生致命错误并停止执行,3)include_once和require_once防止重复包含。这些函数的选择取决于文件的重要性和是否需要防止重复包含,合理使用可以提高代码的可读性和可维护性。

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。
