我有两个 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/