PHP:静态方法的覆盖无法按预期工作

PHP:静态方法的覆盖无法按预期工作,php,class,inheritance,static,Php,Class,Inheritance,Static,我有两个php类:TestUK和TestFR,它们扩展了TestUK 这两个类都用于生成对两个不同域的请求。但继承权出了问题,我不明白为什么 我有一个名为“get_domain”的方法,它被覆盖以获取实际应该使用的域。如果我通过TestFR::get_domain()直接调用它,我将收到预期的结果。但是如果我调用的方法没有被TestFR覆盖,而是使用了self::get_domain(),那么我收到的域是错误的 如果我只是简单地将方法do_stuf从TestUK复制并粘贴到TestFR,那么我就

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

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

我有一个名为“get_domain”的方法,它被覆盖以获取实际应该使用的域。如果我通过
TestFR::get_domain()
直接调用它,我将收到预期的结果。但是如果我调用的方法没有被TestFR覆盖,而是使用了
self::get_domain()
,那么我收到的域是错误的

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

这是什么原因?我对PHP中的类继承没有太多的经验,但我希望它不会出现问题。还是我的方法完全有缺陷

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

这是因为关键字
self
指的是它出现的类,而不是调用该方法的类。对于后一种功能,您必须与
static
关键字一起使用:

static function do_stuff(){
    echo static::get_domain();
}
这就是说,这个代码闻起来真的很糟糕。为什么一切都是静态的,而不仅仅是一个实例方法?为什么
TestFR
扩展
TestUK
而不是同时扩展抽象基类
Test

将所有内容转换为非静态方法会好得多,作为奖励,您的问题会立即消失。

像这样调用它(如果您使用的是php>=5.3)

static::get_domain();

我意识到这是一种更好的方法,它是一些原本不打算使用多个域的旧代码。这两种解决方案(使用“静态”和将类转换为非静态)都有效。这确实让我感到困扰,到底是什么导致了这里的问题。