php - 在 PHP 的扩展类中使用静态函数

标签 php class object abstract-class static-methods

我有一个抽象类,它有一个使用静态函数的方法。这个静态函数是在子类中定义的,并且对于每个子类都是不同的。将使用哪个子类来创建对象是在脚本中确定的。请参阅下面的 super 简化代码:

abstract class fooClass implements iFooClass {    
    function getBar(){
        $bar = self::getSomething();
        return $bar;
    }        
}

interface iFooClass{
    static function getSomething();
}

class fooSubClass_A extends fooClass {
    static function getSomething() {
        //do something;
        //return something;
    }
}

class fooSubClass_B extends fooClass {
    static function getSomething() {
        //do something else;
        //return something else;
    }
}

$foo = New fooSubClass_A;
$bar = $foo->getBar();

这段代码给了我这个错误:

Fatal error: Cannot call abstract method iFooClass::getSomething() in C:\wamp\www\Classes\fooClass.php on line 12

我认为,既然子类可以访问父类(super class)方法 getBar ,那么它将从子类中调用,从而可以访问其静态函数。显然不是。有没有办法重做这个以使其工作?

最佳答案

我认为首先你应该在“fooClass”中实现“iFooClass”接口(interface)的“getSomething”方法,因为所有接口(interface)函数都必须在子类中实现,这是接口(interface)的基本规则。只有在此之后,您才能将此函数包含到另一个类方法中。

编辑:抽象类有能力不实现所有接口(interface)方法(如果它们在其子类中实现)。

Edit2 当您使用 Self 关键字调用方法时,它会从“SELF”实际存在的类中调用方法,而不是从我们调用方法的类对象中调用方法。这就是为什么 self::method() 应该更改为 static::method()

关于php - 在 PHP 的扩展类中使用静态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29059039/

相关文章:

javascript - 如何将 HTML 表单输入存储为 JavaScript 对象

php - 我如何在 php 文件之间传递用户输入?

PHP __toArray() 或 __toObject() 覆盖?

php - 使用 PDO 替换字段中的字符

CSS 合并两个类

c++ - 如何在类中轻松创建 vector 或数组以及如何访问它们

php - 连接 mysql 中的两列并在下拉列表中显示不同的值

c++ - 派生类依赖函数

javascript - 如何使 map 函数返回单个值而不是数组?

java - 继承避免重复的成员变量