PHP类中$this、self、static、final与const关键字用法详解

橘子海
橘子海
发布时间:2026-10-13 | 6人浏览过
原创

深入解析PHP面向对象编程中常用的核心关键字,包括用于访问实例成员的 $this 和 self,用于操作静态资源的 static,声明常量的 const,以及限制继承的 final。

结果与目标

在PHP类定义中,正确区分和使用变量与作用域关键字是编写健壮代码的基础。本文将明确以下关键字的具体用途和调用规则:

  • $this:指向当前类的实例对象。
  • self:指向当前的类本身(非特定实例)。
  • static:定义静态属性和方法,或在内部引用自身。
  • const:声明类常量,其值在运行时不可更改。
  • final:防止类被继承或方法被重写。

准备条件

你需要一个支持PHP语法的开发环境(如PHP 5.3及以上版本,虽然现代开发通常使用8.x+,但基础关键字语法长期兼容),并能执行简单的PHP脚本或Web请求以观察输出结果。

真实操作顺序

第1步:理解并使用 $this 引用实例

目的:在类的内部方法中访问该特定对象的未声明为static的属性或方法。

说明:$this 是一个特殊的伪变量,它仅在类的对象上下文中有效,表示当前激活的对象。你不能在静态方法中使用 $this,因为静态方法不属于任何特定实例。

<?php
class MyClass{
 private $name;
 
 // 构造器通过 $this 设置实例属性
 public function __construct($name){
 $this->name = $name;
 }
 
 // 获取名称
 public function getname(){
 return $this->name;
 }
 
 // 打印名称
 public function printName(){
 echo $this->getname();
 }
}

$myclass = new MyClass("I Like www.jb51.net");
$myclass->printName(); // 输出:I Like www.jb51.net
?>

第2步:掌握 const 声明类常量

目的:定义属于类的固定不变的值。

注意:常量的声明格式必须为 const NAME=value,不需要使用 $ 符号。常量一旦定义便不可修改。如果需要通过类内部方法访问常量,通常使用 self::CONST_NAME。

<?php
class clss_a{
 const PI=3.14; // 正确的常量声明
 private static $name="static class_a"; 
 public $value; 
 
 // 访问静态属性需使用 self::$var
 public static function getName(){ 
 return self::$name; 
 } 
 
 // 错误示例:静态方法不能直接访问非静态属性 $value
 // public static function getName2(){ 
 //     return self::$value; 
 // } 
 
 // 访问常量需使用 self::CONST
 public function getPI(){ 
 return self::PI; 
 }
}
?>

第3步:使用 static 定义共享状态

目的:定义在所有实例之间共享的变量或独立于实例的方法。

规则:

  1. 静态属性只保存一个值,对所有该类实例有效。
  2. 静态方法可以通过 ClassName::method() 或内部 self::method() 调用。
  3. 如果在方法前使用了 static,该方法只能访问静态成员。

场景A:在内部自引用

<?php
class MyObject{
 public static $myStaticVar = 0;
 
 function myMethod(){
     // 在类内部推荐使用 self 访问静态成员
     self::$myStaticVar += 2;
     echo self::$myStaticVar . "
"; } } $instance1 = new MyObject(); $instance1->myMethod(); // 输出: 2 $instance2 = new MyObject(); $instance2->myMethod(); // 输出: 4 (因为是静态,全局累加) ?>

场景B:外部访问与统计计数器

<?php
class Book{
 static $num=0;
 
 public function showMe(){
     echo "您是滴".self::$num."位访客"."
"; self::$num++; } } $book1 = new Book(); $book1->showMe(); $book2 = new Book(); $book2->showMe(); // 也可以直接用类名访问 echo "总访客数: " . Book::$num; ?>

第4步:应用 final 限制继承与覆盖

目的:确保某些关键逻辑不被子类篡改或扩展。

规则:

  • final class:该类不能被任何其他类继承。
  • final method:该方法不能在子类中被重写(Override)。

操作演示:尝试重写会被禁止

<?php
// 父类包含普通方法和 final 方法
final class BaseClass {
    public function test() {
        echo "BaseClass::test() called
"; } final public function moreTesting() { echo "BaseClass::moreTesting() called
"; } } // 尝试继承 class ChildClass extends BaseClass { public function test() { echo "ChildClass::test() called
"; // OK,父类该方法非final } // 警告/错误:以下代码会导致 Fatal error // public function moreTesting() { ... } } $obj = new ChildClass(); $obj->test(); $obj->moreTesting(); ?>

第5步:正确使用 self 进行内部调用

目的:在类的内部访问本类定义的静态成员、方法和常量。

总结区别:

  • $this:实例化后,通过对象调用的上下文。
  • self:类级别的上下文,指向“当前这个类定义”。常用于 self::$staticVar, self::constant, self::method()。
  • parent:指向父类,用于调用父类的方法或属性(如 parent::__construct())。

完成判断

当你能够准确解释为什么静态方法不能使用 $this,知道如何在外部通过 类名::属性 访问静态变量,并理解 final 关键字的阻断性时,即表示已掌握这些关键字的基本用法。

简要总结

以上就是对PHP类中 $this、static、final、const、self 这几个关键字使用方法的全部内容介绍。合理使用它们能让代码结构更清晰、逻辑更严密。更多关于PHP面向对象编程的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表