小熊奶糖(BearCandy)
小熊奶糖(BearCandy)
发布于 2024-03-08 / 24 阅读
0
0

php 面向对象 类的继承、静态方法及静态变量

在PHP中,类的继承、静态方法及静态变量的使用是面向对象编程的重要组成部分。下面分别就这些概念和如何调用它们做简要概述:

类的继承

在PHP中,父类不能直接访问子类中定义的方法和变量。由于PHP不支持向上转型(upcasting),父类引用无法指向子类对象并直接调用子类特有的方法或访问子类新增的属性。

然而,在某些情况下,父类可以通过定义一些抽象方法或接口,并要求子类去实现它们,从而间接地“访问”子类的方法。子类在实现这些方法时,可以包含子类自己的逻辑。

另外,如果父类的方法内调用了 parent::构造器或方法,那么实际上是在调用自身的那个同名方法或构造器,而不是子类的。但如果子类覆盖了某个方法并在子类实例上调用这个方法时,调用的就是子类覆盖后的方法,这被称为“多态”。

总结来说,父类不能主动访问子类的特有方法和属性,但可以通过设计抽象性和多态性让子类自行扩展并提供具体实现。

在PHP中,一个类可以通过使用关键词 extends 来继承另一个类的属性和方法:

// 定义父类
class ParentClass {
    public $parentProperty;
  
    public function parentMethod() {
        // ...
    }
}

// 定义子类,继承ParentClass
class ChildClass extends ParentClass {
    public $childProperty;

    public function childMethod() {
        // ...
    }
}

// 创建ChildClass的实例并访问父类和子类的属性和方法如果父类中存在构造函数且存在参数时,子类在实例化对象时也要提供参数,因为子类继承父类
$child = new ChildClass();
$child->parentProperty = 'From Parent';
$child->childProperty = 'From Child';
$child->parentMethod();
$child->childMethod();

静态方法

静态方法属于类而非类的实例,因此可以在没有创建类实例的情况下通过类名直接调用:

class MyClass {
    public static function staticMethod() {
        echo 'This is a static method.';
    }
    public function act(){
        echo "调用静态方法".self::staticMethod();
     }
}

// 直接通过类名调用静态方法
MyClass::staticMethod();

静态变量

静态变量(静态属性)是在类的所有实例间共享的,且仅需定义一次。静态变量可通过类名或类的实例来访问:

class MyClass {
    public static $staticVar = 'Initial Value';

    public function nonStaticMethod() {
        // 通过类名访问静态变量
        echo self::$staticVar . "\n";
  
        // 或者,也可以通过self关键字访问
        echo static::$staticVar . "\n"; // 使用Late Static Binding,确保在继承中正确引用
    }
}

// 通过类名设置和获取静态变量
MyClass::$staticVar = 'New Value';
echo MyClass::$staticVar . "\n";

// 创建类的实例并调用非静态方法来访问静态变量
$myObj = new MyClass();
$myObj->nonStaticMethod();

值得注意的是,在PHP中,如果子类重写了父类的静态方法,那么调用静态方法时会根据实际调用的类来决定执行哪个版本的方法。而对于静态属性,子类并不能直接重写父类的静态变量,但可以在子类中定义同名的静态变量,这实际上是在子类作用域内创建了一个新的静态变量,而非覆盖父类的静态变量。如果需要在子类中改变父类静态变量的行为,通常会在子类的静态方法内部去操作父类的静态变量。

使用静态方式不可调用除静态方法/变量以外的变量


评论