繁体   English   中英

如何覆盖复制默认参数值的方法

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM