PHP类中$this、self、static、final与const关键字用法详解
深入解析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 定义共享状态
目的:定义在所有实例之间共享的变量或独立于实例的方法。
规则:
- 静态属性只保存一个值,对所有该类实例有效。
- 静态方法可以通过
ClassName::method()或内部self::method()调用。 - 如果在方法前使用了
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面向对象编程的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









