金沙上线钻孔化

当事情变得更加更新时,会发生僵化。这是一个过程,超过最终状态。特别地,当签名在多个类中共享时,它会发生金沙上线。使用界面和继承,更改金沙上线的一些元素’S签名意味着在其他几个位置重构代码。更难的:金沙上线玻璃化在工作中。

单一金沙上线

可以完全自由更新单个金沙上线。当子类没有覆盖时,它是单身,也没有在上升类中的克隆。因此,更新签名仅具有本地影响。

显然,它可能影响了这种金沙上线的呼叫者。在本文中,我们只会考虑对其他代码的影响,而不是代码用户。

实际上,改变代码签名可能没有影响。例如,向金沙上线添加一个新的typehint:该金沙上线受到影响,并且在任何非法呼叫旁边,呼叫者赢了’t be affected.

<?php

class x {
    // target : function method(int $a) {
    function method($a) {
        // simple method, isn't it?
        return $a + 1;
    }
}

?>

继承的金沙上线

继承的金沙上线是一个或多个父或/和孩子的金沙上线。在下面的图中,您可以看到两个继承的金沙上线:一个是x类,另一个在课堂上。由于他们的签名必须与另一个人兼容,因此我们可以将它们视为一个且仅签名。此处的实际执行代码块并不重要。

<?php

类x {函数金沙上线($ a){//简单金沙上线,isn’它?返回$ a + 1; }}

Class y扩展X {函数金沙上线($ B){//覆盖金沙上线,具有不同的代码返回$ b + 2; }}

?>

参数名称是免费的

更改其中一个金沙上线的名称将分割它们,我们’LL回到我们最初的单一金沙上线的情况。那一点很明显。

然后,我们可以看到PHP不起作用’t enforce the same names in both signatures : arguments may be freely renamed, between versions, without impact. At least, no impact for PHP, as it will have significant impact on whoever is reading the code. Imagine the code above, with method($a, $b) turning into method($b, $a) in the next class, to see the potential damages.

当PHP获取命名参数时,这将更改,这必然会发生在PHP 8.0中。在此之前,参数不是PHP兼容性检查的一部分。

论点是重要的

另一方面,强制性论点的数量很重要。除非它没有,否则无法更改参数的数量’t change the number of compulsory arguments. Those are the arguments without a default value. The simple rule is that x::method() may be called just like y::method(). This is the principle of replacement : the methods are interchangeable.

只要额外的参数保持默认值,实际参数的数量可能会在金沙上线版本之间发生变化。当发生这种情况时,义务论见处的数量保持不变,尽管可以用不同数量的参数调用这两种金沙上线。当他们不是强制性时,这些参数将被忽略:这是不同的,而是兼容的,也是非常兼容的。

<?php

class x {
    // one compulsory argument
    function method($a) {
        return $a + 1;
    }
}

class y extends x {
    // one compulsory argument, one optional argument
    function method($b, $increment = 2) {
        return $b + $increment;
    }
}

?>

注意,在继承金沙上线之间具有不同数量的参数既兼容,也很令人惊讶。鉴于这些类生活在不同的文件中,并且很少在同一屏幕中,不同于上图中,这样的差异将不可见,直到曾经为y类的某人尝试使用类x类的第二个参数,或者有人使用对于X类,将清除代码和删除参数2. PHP语法的合法是共享代码库或代码演进的繁琐。

最后,参数限制唐’T适用于构造函数:他们可能会从一个班级自由改变他们的签名。

<?php

class foo {
    function __construct() {}
}

class bar extends foo {
    function __construct($a, $b) {}
}

?>

金沙上线钻孔化

在审查继承金沙上线的简单情况后,我们现在达到了化石化的特殊情况。当相同的金沙上线多次覆盖相同的金沙上线时,会发生这种情况。

金沙上线钻石在实际代码中
金沙上线钻石实际代码:最多13份

例如,在这个项目中,我们可以看到这两种金沙上线最多有13个版本,而且有几种有11个版本。通常,构造函数和其他魔法金沙上线,遵循类层次结构中的相同模式,尽管没有必要。

这种高度继承与历史性代码出现,其中几年后增加了几个代码;或者,当采用组件策略时,已选择一个模板,作为界面或抽象等级,并创建多个组件,适用相同的模具。

随着代码的发展,您可能最终可以使用像这样的图表。

 

钻孔树
多种液体化钻孔

每个广场都是一个类,一个常用金沙上线:只显示类。如果在C2中需要某种适应,则表示在C2中重构该金沙上线。依次导致在C1中重构金沙上线,因为C1是父类。 C1有2个其他儿童,即C3和C4,也需要一些更新。然后我们’LL移动到祖父母C5,同一过程将重复。最后,在C2中更改金沙上线签名意味着在应用程序中更改6类中的代码。

适用于类型

这对金沙上线签名中的类型的选择直接影响。通过PHP检查Typehints,以便课程之间的兼容性。这意味着类型的类型是重要的设置。

使用PHP 7.4,Return Typehint是协变的,这意味着它们可能会返回比父母更具体的类型;参数typehints是抵消,这意味着它们可能会接受比他们的父母更通用的类型。

采用typehints.

特别是,这意味着在采用类型时容易忽略渗透金沙上线问题。如下,如下所示,在某些金沙上线中洒在一些金沙上线中,并且合法。

<?php

class foo {
    function method(int $a)  {}
}

class bar extends foo {
    function method($a) : int {}
}

?>

后来,这种金沙上线将陷入困难的情况,其中一些金沙上线采用了不同的类型。此时,化石化金沙上线将需要在代码中进行协作以协调它。

标量cul-de-sac

协方差 逆行对于逃避金沙上线钻石地狱非常有用。然而,他们有一个死角:标量的式。标量写通常是所采用的第一种类型:通过观察目前的情况,或已经建立的类型的传播,标量倾向于更快地侵入代码,而不是类别刻度:它们不需要太多设置,并且很容易理解。

它们也难以重构。

作为标量值意味着差异(直接或矛盾)可以’用于将简单的浮点值转换为更多(或更少)有意义的对象。

<?php

class foo {
    function method(float $a) : y {}
}

class bar extends foo {
    function method(float $a) : x {}
}

// For context only
class x extends y {}

?>

结合化石化金沙上线,标量类型创建一个很好的障碍:必须在多个类中协调变化,让他们每个人都从标量跳到类别的typehint。这通常很难。

界面类型是typehints.

最后,化石化金沙上线是最灵活的界面式的类型(或抽象类)。有一些边距可以独立地发展和返回类型,同时保持一致的方式以SANE方式调用所有这些金沙上线。

<?php

class foo {
    function method(x $a) : y {}
}

class bar extends foo {
    function method(y $a) : x {}
}

// For context only
class x extends y {}

?>

避免金沙上线钻孔

鉴于我们从一开始所介绍的所有地面,您可能已经发现了几种金沙上线来逃避金沙上线化石化钻孔。

  • 监测骨化 : Exakat’S静态分析仪斑点所有化石化金沙上线。在大使报告中,检查 ‘Audit logs > Fossilized methods’.
  • 减少和去除化石化 :在较低的水平时,一些遗传不可避免,也不是可取的。 exakat有一个分析,可以设定可接受的水平 钻孔化,所以你可以及时警告。
  • 限制标量写课程的标量写级别 :确保返回布尔值或整数将是合理的,可在可到期的未来合理。跳过标量型并移动到界面式类型,以便更灵活。
  • 大学教师’t forget your users :更改类型或金沙上线签名是一个兼容性中断。即使似乎没有影响,在文档中提及它,并将其保留为主要版本。
  • 跳过继承 :没有遗传,没有僵化。

exakat. 是有效和系统地分析,报告和评估PHP代码源的工具。 Exakat处理PHP 5.2至7.4和8.0代码,以及报告安全,性能,代码质量,迁移,现代化…