首页 > 解决方案 > PHP通过多层类继承方法

问题描述

我有代码,当大量归结起来时,看起来很像这样:

abstract class Car {
    public abstract static function parts();
    protected static function getParts() {
        $parts = [];
        $properties = (new ReflectionClass(static::class))->getProperties();
        foreach ($properties as $property) {
            $parts[] = $property->getName();
        }
        return $parts;
    }
}
class Ford extends car {
    public $wheels;
    public $body;
    public static function parts() {
        return self::getParts();
    }
}
class FordTruck extends Ford {
    public $truckBed;
}

function getBaseParts($cartype) {
    return $cartype::parts();
}

但是当我打电话时getBaseParts("FordTruck")我会回来

array(3) {
  [0]=>
  string(8) "truckBed"
  [1]=>
  string(6) "wheels"
  [2]=>
  string(4) "body"
}

实际上,我只想要返回“轮子”和“身体”,而不是在过去的课程中添加的“无关”的东西Ford。我认为parts()在我关心的部分的类中创建一个方法,然后调用self::getParts(),这反过来又从中获取属性static意味着“静态”所指的类将是Ford该类。但它更像是parts()FordTruck课堂上打来的。

有没有办法通过这个设置获得我正在寻找的功能?我能想到的“最简单”的方法是将“getParts()”方法移动到Ford类中并让它调用self的反射类,但是我有几十个扩展Ford这些类的类,如果我修复它,它们都会被复制代码那样。

标签: php

解决方案


我不是这个解决方案的真正粉丝,你宁愿改变你的解决方案背后的心态,但这里有一个简单的解决方案来解决你的问题

<?php

abstract class Car {
    public abstract static function parts();
    protected static function getParts($class = null) {
        return array_keys(get_class_vars($class ?? static::class));
    }
}
class Ford extends car {
    public $wheels;
    public $body;
    public static function parts() {
        return self::getParts(Ford::class);
    }
}
class FordTruck extends Ford {
    public $truckBed;
}

function getBaseParts($cartype) {
    return $cartype::parts();
}

var_dump(getBaseParts("FordTruck"));

测试:https ://3v4l.org/s8Aar


推荐阅读