Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的重写方法?_Php_Oop_Overriding_Implements - Fatal编程技术网

PHP中的重写方法?

PHP中的重写方法?,php,oop,overriding,implements,Php,Oop,Overriding,Implements,在Java等其他OO语言中,我们可以覆盖函数,可以使用关键字/注释,如实现,@override等 在PHP中有这样做的方法吗?我的意思是,例如: class myClass { public static function reImplmentThis() { //this method should be overriden by user } } 我希望用户实现自己的myClass::reImplementThis()方法 如何在PHP中实现这一点?如果可能的话,我可以选择

在Java等其他OO语言中,我们可以覆盖函数,可以使用关键字/注释,如
实现
@override

在PHP中有这样做的方法吗?我的意思是,例如:

class myClass {
    public static function reImplmentThis() { //this method should be overriden by user
    }
}
我希望用户实现自己的
myClass::reImplementThis()
方法

如何在PHP中实现这一点?如果可能的话,我可以选择吗

我的意思是,如果用户没有实现该方法,我可以指定一个默认方法,还是可以标识该方法没有定义(我可以使用
method\u exists
)执行此操作?



这样,类TestTest必须覆盖函数测试。

是的,有。您可以选择通过扩展类并使用基类中的相同名称、函数签名和访问说明符(公共或受保护)定义方法来重写方法。该方法不应在基类中声明为抽象的,否则将要求您在派生类中实现它。在您的示例中,它看起来像这样:

class MyClass {
    public static function reImplmentThis() { //this method should be overriden by user
    }
}

class MyDerivedClass extends MyClass {
    public static function reImplmentThis() { //the method you want to call
    }
}
如果用户不重写它,MyDerivedClass仍将有一个从MyClass继承的ReImplingThis()方法

也就是说,在从派生类调用扩展静态方法时需要非常小心,以避免出现问题。我鼓励您重构代码以扩展实例方法,除非您有扩展静态类的特殊需要。如果您认为没有比扩展静态类更好的方法了,请务必非常理解


是的,可以检查是否实现了该方法,并获得有关使用该方法的类的更多信息。

这涉及到几个OOP主题

首先,简单地重写父类中声明的方法与在继承类中重新声明方法一样简单

例如:

班级人员{
公共函数问候语(字符串$who){
回声“你好,谁!”;
}
}
类扩展人{
公共函数问候语(字符串$where=“everyone”){
回声:“你好,谁!你好吗?”;
}
}
$a=新汤米();
$a->问候(“世界”);
//产出:
//世界好!你好吗?
如果要在重写方法上重用重写方法的逻辑,只需从扩展类调用父方法即可:

class Tommy
{
    public function greet(string $whom)
    {
        // now with more emphasis!!!
        echo parent::greet(strtoupper($whom)) . "!!!!";
    }
}
现在
Tommy::greet()
调用
Person::greet()
,但在返回结果之前修改结果

需要注意的一点是,重写方法必须与重写方法兼容:方法可见性不能比原始方法更具限制性(可以增加可见性),并且必需的参数的数量和类型不能与原始增量冲突

这是可行的,因为参数的类型与原始参数不冲突,并且我们需要的参数比父参数少:

class-Person{
公共函数问候语(string$where=“华丽”,string$greet=“Whatsup”){
回声“$问候$谁,你好吗?”;
}
}
但事实并非如此,因为还有额外的必需参数。这将使得无法透明地将原始类切换到此类,因此将抛出一条
警告


类BadBob扩展了Person{
公共函数greet(字符串$where,字符串$greet){
回声“$问候$谁,你好吗?”;
}
}
此外,您在问题中提到“此方法应由用户重写”。如果需要客户机类来实际实现该方法,则有两个选项:

抽象类和方法

这些方法的实现是空的,扩展类要实现的方法是有效的。年,我们将原来的班级
Person
改为:

抽象类人物{
公共函数问候语(字符串$who){
回声“你好,谁!”;
}
公共抽象函数hide();
}
  • 因为现在这个类包含一个抽象方法,所以它也需要声明为一个抽象类
  • 现在不能直接实例化
    Person
    ,只能在其他类中扩展它
  • 现在,我们所有现有的
    Person
    扩展类都是错误的,试图执行前面的代码会抛出致命错误
现在扩展
Person
的有效类示例如下:

类Archie扩展了Person{
公共函数隐藏(){
回声“躲在灌木丛后面”;
}
}
任何扩展
Person
的类都必须声明一个public
hide()
方法

接口

最后,您提到了接口。接口是实现类必须履行的契约。它们声明了一组公共方法,但没有实现主体

例如:


接口警察{
公共职能逮捕(人$人):bool;
公共功能帮助($what):bool;
}
现在我们可以有一个类来扩展
Person
并实现
police

类Jane扩展了Person实现{
公共函数隐藏(){
echo“简躲在巡逻车里”;
}
公共职能逮捕(人$人):bool{
//实施逮捕法
返回false;
}
公共功能拍摄($what):bool{
//实现shot()方法
返回false;
}
}

重要的是,虽然可以只扩展一个类(PHP中没有多重继承),但是可以实现多个接口,并且必须满足每个接口的要求才能使类有效。

这正是继承的目的。一般来说,我会
class Tommy
{
    public function greet(string $whom)
    {
        // now with more emphasis!!!
        echo parent::greet(strtoupper($whom)) . "!!!!";
    }
}