PHP OOP self、parent 和 static 引用

在面向对象编程(OOP)的上下文中,selfparentstatic 是关键字或伪变量,它们提供了一种访问类内部元素的方式。这些引用在 PHP 中非常有用,尤其是在处理继承和静态成员时。

self

self 关键字用于引用当前类的上下文。它可以用来访问当前类中的静态变量、方法和常量。self 主要用在非静态环境,例如对象方法内部。

class MyClass {
    public static $myStaticProperty = 'Hello, World!';

    public function test() {
        return self::$myStaticProperty; // Accessing the static property using self
    }
}

在上面的例子中,self::$myStaticProperty 用于访问 MyClass 类中的静态属性 $myStaticProperty

parent

parent 关键字与 self 相似,但它引用当前类的父类。这在需要调用父类方法时非常有用,特别是在重写了某个方法后。

class ParentClass {
    public function test() {
        return 'Parent class';
    }
}

class ChildClass extends ParentClass {
    public function test() {
        echo parent::test(); // Calling the parent's method using parent
        return 'Child class';
    }
}

在这个例子中,parent::test() 用于调用 ParentClass 类中的 test 方法。

static

在静态上下文中,static 关键字引用了当前类。它通常用于访问静态成员、调用静态方法或获取类名称。

class MyClass {
    public static $myStaticProperty = 'Hello, World!';

    public static function test() {
        return static::$myStaticProperty; // Accessing the static property using static
    }
}

class ExtendedClass extends MyClass {}

echo ExtendedClass::test(); // Outputs: Hello, World!

在这个例子中,static::$myStaticProperty 用于访问 MyClass 类中的静态属性。由于 ExtendedClass 继承自 MyClass,因此它们共享同一个静态属性值。

Late Static Bindings (Late Static Context)

PHP 5.3 引入了 late static bindings(后期静态绑定)的概念,用关键字 static 来代替 self 实现动态绑定。这意味着在继承上下文中,static:: 将会根据对象类型而不是定义类型解析。

class ParentClass {
    public static function who() {
        return __CLASS__;
    }
}

class ChildClass extends ParentClass {}

echo ParentClass::who(); // Outputs: ParentClass
echo ChildClass::who();  // Outputs: ChildClass

在这个例子中,如果使用 self:: 代替 static::,那么两个调用都将输出 ParentClass

希望这篇教程能帮助您更好地理解并使用 PHP OOP 中的 self、parent 和 static 引用。如有任何问题或需要进一步解释,请随时提问!