PHP:静态方法的覆盖无法按预期工作
我有两个php类:TestUK和TestFR,它们扩展了TestUK 这两个类都用于生成对两个不同域的请求。但继承权出了问题,我不明白为什么 我有一个名为“get_domain”的方法,它被覆盖以获取实际应该使用的域。如果我通过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,那么我就
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();
我意识到这是一种更好的方法,它是一些原本不打算使用多个域的旧代码。这两种解决方案(使用“静态”和将类转换为非静态)都有效。这确实让我感到困扰,到底是什么导致了这里的问题。