PHP:覆盖静态方法不能按预期工作

Maj*_*jiy 8 php inheritance static class

我有两个php类:TestUK和TestFR,它扩展了TestUK.

这两个类都用于生成对两个不同域的请求.但是继承权出了问题,我不明白为什么.

我有一个名为"get_domain"的方法,它被覆盖以获取实际应该使用的域.如果我直接通过它TestFR::get_domain(),我会收到预期的结果.但是,如果我调用一个未被TestFR覆盖但使用的方法,则会self::get_domain()收到错误的域名.

如果我只是将方法do_stuff从TestUK复制并粘贴到TestFR,那么我得到了预期的结果.但复制粘贴相同(!)代码正是我试图避免的.

这是什么原因?我在PHP中没有那么多类继承的经验,但我希望这可以毫无问题地工作.或者我的approch完全有缺陷?

<?php
class TestUK {

    const DOMAIN_UK = 'http://www.domain.co.uk';
    const DOMAIN_FR = 'http://www.domain.fr';

    static function get_domain(){
        return self::DOMAIN_UK;
    }

    static function do_stuff(){
        echo self::get_domain();
    }

}

class TestFR extends TestUK {

    static function get_domain(){
        return self::DOMAIN_FR;
    }

}

// Works as intended:
// Expected and actual output: http://www.domain.fr
echo TestFR::get_domain();

// Does NOT work as intendes:
// Expected Output: http://www.domain.fr
// Actual Output:   http://www.domain.co.uk
TestFR::do_stuff();
?>
Run Code Online (Sandbox Code Playgroud)

Jon*_*Jon 17

这是因为关键字self指的是它所在的类,而不是指调用该方法的类.对于后一种功能,您必须使用后期静态绑定static关键字:

static function do_stuff(){
    echo static::get_domain();
}
Run Code Online (Sandbox Code Playgroud)

也就是说,这段代码闻起来很糟糕.为什么一切static而不仅仅是一个实例方法?为什么TestFR扩展TestUK而不是扩展抽象基类Test

这将是很多更好的一切转换成非静态方法,并作为奖励您的问题将立即消失.