[英]How can I overwrite a method whitout copy the default argument values
我有以下问题:
我有一个扩展类A的类B。类A具有一个方法M,该方法具有第一个参数p1(必需)和第二个参数p2(可选)。 p2具有默认值V。B覆盖了方法M,因此其签名与A的M相同。
我真的很担心某些开发人员对A的默认值p2(V)的更改,这些更改不会想象它会被子类覆盖并且V在他的M签名上重复出现。
那么可以在A的子类上创建M而不将V作为默认值,但是保持行为吗?
class A
{
public function M($p1, $p2 = 'V')
{
}
}
class B extends A
{
public function M($p1, $p2 = null)
{
//do something more
return parent::M($p1, $p2);
/*
if user don't pass $p2, it will be null and will pass null to A::M too.
Is not what I want. I would like A::M get his $p2 default value 'V'.
*/
}
}
首先,我想说,不“信任”开发人员以正确的方式使用代码可能有点怪异。
但是我有一个建议,因为您可以控制父类A
,所以可以将一些逻辑添加到实现中,如果传递了null
,则仅使用值V
class A {
public function M($p1, $p2 = 'V') {
if ($p2 === null) $p2 = 'V';
}
}
是非常不错的PHP函数func_get_args
<?php
function aa($a, $b = null) {
var_export([$a, $b, func_get_args()]);
}
aa('1 argument');
aa('second NULL', null);
在第一种情况下,它仅返回1个元素的数组,因此您可以检测到它是默认值还是传递的值。
在A
声明$p2
的类型。 然后它将不接受空值。
class A
{
public function M($p1, string $p2 = 'V')
{
}
}
子类中的M
方法仍然可以具有null
默认值,这很好。 人们在扩展课程时应该能够更改默认值。 他们可以根据需要更改M
方法的整个行为。 但是如果它调用parent::M($p1, $p2);
如果不分配字符串,则会出现类型错误。 您需要处理的情况是您的代码执行了意外的操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.