PHP中的重写方法?
在Java等其他OO语言中,我们可以覆盖函数,可以使用关键字/注释,如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中实现这一点?如果可能的话,我可以选择
实现
,@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
的类都必须声明一个publichide()
方法
接口
最后,您提到了接口。接口是实现类必须履行的契约。它们声明了一组公共方法,但没有实现主体
例如:
接口警察{
公共职能逮捕(人$人):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)) . "!!!!";
}
}