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

标签 php class inheritance static

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

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

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

如果我只是将方法 do_stuff 从 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 指的是它所在的类,而不是调用该方法的类。对于后一种功能,您将必须使用 late static binding使用 static 关键字:

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

就是说,这段代码真的很难闻。为什么一切都是 static 而不是简单的实例方法?为什么 TestFR 扩展 TestUK 而不是同时扩展抽象基类 Test

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

关于PHP:覆盖静态方法无法按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18848373/

相关文章:

php - 函数式编程练习

c++ - 我应该初始化抽象类的成员吗?

c++ - 使用多重继承时的编译错误

php - 如何在php json编码后删除隐藏的垃圾字符

Java类关键字

c++ - 是什么导致了我的错误?我正在尝试创建一个玩家类并将玩家名称存储为变量

wpf - 从WPF中的UserControl继承

javascript - 动态 jquery 验证无法正常工作

php - iPhone 手机 safari JSON 解析错误

php - 我可以在 Codeigniter 上使用两个 mysql 用户吗?