【问题标题】:Using static function in extended class in PHP在 PHP 的扩展类中使用静态函数
【发布时间】:2015-05-17 12:25:07
【问题描述】:

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

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();

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

致命错误:无法在第 12 行的 C:\wamp\www\Classes\fooClass.php 中调用抽象方法 iFooClass::getSomething()

我认为由于子类可以访问超类方法getBar,它将从子类调用,因此可以访问其静态函数。显然不是。有没有办法重做它以使其工作?

【问题讨论】:

    标签: php class object abstract-class static-methods


    【解决方案1】:

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

    编辑:抽象类有能力不实现所有接口方法,如果它们在它的子类中实现的话。

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

    【讨论】:

    • fooClass 是永远不会真正实例化的抽象类,而getSomething 是仅在子级中定义的静态方法,并且每个子级略有不同。我应该在抽象类fooClass 中放入什么实现?只是一个空方法static function getSomething(){}?
    • 静态函数 getSomething() { echo "All";我在 fooClass 中添加了这个并且工作正常:)。
    • 它是在调用fooSubClass_A 静态方法吗?因为这是我想在上面的例子中调用的静态方法。
    • 我解决了这个问题。您在 foosubClass 中使用 self 这意味着当您调用它时,您会从它实际存在的类中调用方法,而不是从您的对象所在的类中调用方法。将 self::getbar() 更改为 static::getbar()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-19
    • 2015-07-05
    • 2016-08-27
    • 1970-01-01
    • 2013-10-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多