php - 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
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"));
推荐阅读
- python - request.user.is_authenticated 在某些页面上的某些 HTML 上为假,但在视图中则不然
- java - 无法遍历java中链表中的所有元素
- r - 制作分组条形图
- node.js - 发布请求在 node.js express/mongoose 中不起作用
- sql - 尝试更新表时 SQL Developer 中的错误
- settings - Godot引擎输入映射
- java - Lambda 表达式 Java 和 Stream 中的类型错误
- java - 选中复选框时自动添加变量 Android Studio
- nuxt.js - 是否可以收听 NuxtChild 事件
- c++ - 类不扣除其模板参数