PHP面向对象程序设计中的self、static、parent关键字

平面设计 2025-04-05 18:44www.168986.cn平面设计培训

本文旨在深入PHP面向对象程序设计中的self、static和parent这三个关键字的用法。结合实例,我们将详细它们的功能、应用场景及相关使用技巧。

在没有继承的情况下,self和static在范围操作符(::)的使用上没有明显区别。在静态函数中,它们都可以用来调用静态属性和静态函数,此时不需要实例化类。而在非静态函数中,除了可以调用静态属性和函数外,self还可以调用非静态函数。

例如,在以下代码中:

```php

class Demo {

public static $staticVar;

public $instanceVar;

public function __construct() {

self::$staticVar = "Static Var"; // 使用self调用静态属性

$this->instanceVar = "Instance Var"; // 使用$this调用实例属性

}

public static function staticMethod() {

// 静态方法

}

public function instanceMethod() {

// 非静态方法

}

}

```

无论是使用self还是Demo类名来调用静态属性或方法,效果都是一样的。在非静态方法中,只能使用self来调用非静态方法。

接下来,让我们看看继承时的情况。在继承中,self、static和parent各自发挥着不同的作用。子类可以通过parent关键字来访问父类的属性和方法。而self始终指向当前类,无论是否继承。static则可以在任何地方访问静态属性和静态方法,不受类的继承关系影响。

例如,假设有一个父类ParentDemo和一个子类ChildDemo,子类继承了父类的某些属性和方法。在子类中,可以使用parent关键字来访问父类的属性和方法。而无论在哪个类中,都可以使用static关键字来访问类的静态属性和静态方法。至于self关键字,它始终指向当前类,因此在子类中可以使用它来访问子类自己的属性和方法,也可以访问父类的公有属性和方法(通过parent)。

理解PHP中的静态方法与类关系

在PHP中,静态方法是一种特殊的存在,它存在于类本身而不依赖于任何特定对象。让我们通过几个例子来深入理解静态方法以及它们在不同类关系中的表现。

让我们看一个包含类A和类B的简单示例。类A定义了两个静态方法:getClassName和testStatic。类B继承自类A并覆盖了getClassName方法。当我们调用B::testSelf()和B::testStatic()时,输出结果为:

输出结果:

this is class A(来自类A的getClassName方法)

this is class B(来自类B的getClassName方法)

在静态方法中,self::调用的静态方法或属性始终表示其在使用时的当前类的方法或属性。在类名很长或可能变化的情况下,使用self::的方式是更好的选择。另一方面,static::调用的静态方法或属性会在继承中被子类覆盖,因此应该替换为对应的子类名。

接下来,我们分析另一个关于父类关键字和静态方法的例子。在这个例子中,类A有一个静态属性和一个非静态属性,以及两个静态方法(staticFun和noStaticFun)。类B继承自类A,并在其方法中调用父类的静态方法和非静态方法。输出结果如下:

输出结果:

static(来自类A的静态属性)

this is function show with Nostatic(来自类B的noStaticFun方法)

在这个例子中,我们了解到在静态方法中,可以使用parent关键字调用父类的静态方法和属性。而在非静态方法中,可以直接使用$this访问父类的非静态方法和属性。这表明在继承关系中,子类可以访问并调用父类的属性和方法。

让我们看一个关于static关键字在不同类关系中的调用的复杂例子。在这个例子中,有三个类:A、B和C。每个类都有一个名为foo的静态方法和一个名为who的静态方法。当我们在C类中调用test方法时,输出结果为:

输出结果:

A(来自A类的foo方法中调用who方法)

C(回溯到B类的foo方法中调用C类的who方法)

C(直接调用C类的foo方法中调用who方法)

PHP中的类继承与静态方法调用

在PHP中,类继承是一种强大的功能,它允许子类继承父类的属性和方法。静态方法的调用也是PHP中一个重要的特性。本文将通过示例来在类继承中静态方法的调用过程。

我们来看第一个示例:

```php

class A {

public static function foo() {

static::who(); // 调用当前类的静态方法who()

}

public static function who() {

echo __CLASS__.""; // 输出当前类名

}

}

class B extends A {

public static function test() {

A::foo(); // 直接调用A类的foo方法

parent::foo(); // 调用父类的foo方法,由于B没有实现foo方法,所以调用的是A类的foo方法

self::foo(); // 调用当前类B的foo方法,但由于B没有定义foo方法,同样会调用A类的foo方法

}

echo __CLASS__.""; // 输出B类名

}

}

class C extends B { / 类C继承了类B / }

```

上一篇:不小心看到爸妈过程的事例 下一篇:没有了

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by