Дело в том, что у нас есть три класса A, B и C. B и C наследуются от A.
<?php
class A{
public static function update(){
static::$id = 1;
}
}
class B extends A{
public static $id_B;
}
class C extends A{
public static $id_C;
}
A::update();
?>
По каким-либо причинам имена идентификаторов в B и C различаются. B — это id_B, а C — это id_C. Класс A является своего рода интерфейсом, поэтому он просто знает, что унаследованные классы B и C должны иметь переменную $ id. A хочет обновить $ id до 1. То, что я хочу, это попытаться обновить $ id_B и $ id_C до 1. Я попробовал несколько методов, таких как установка переменных переменных, например:
class A{
public static function update(){
static::$$id_name = 1;
}
}
class B extends A{
public static $id_name="id_B";
public static $id_B;
}
Но это не работает. Так кто-нибудь может помочь мне решить этот дизайн?
Да, просто так не работает. Либо вы знаете, к какой переменной вы хотите получить доступ, либо вы оставляете это для индивидуализированного кода. Например:
class A {
public static function update(){
static::updateId(1);
}
protected static function updateId($value) {
static::$id = $value;
}
}
class B extends A{
public static $id_B;
protected static function updateId($value) {
static::$id_B = $value;
}
}
class C extends A{
public static $id_C;
protected static function updateId($value) {
static::$id_C = $value;
}
}
Синтаксис, который вы искали с помощью переменной переменной:
static::${static::$id_name} = 1;
Но я бы предложил вместо этого использовать перегружаемые методы, которые дают вам больше контроля в долгосрочной перспективе. «Интерфейсы» лучше всего определяются вызываемыми функциями, а не именами переменных. Хорошая идея начать с того, делать ли все это статически, — это другое обсуждение.
Других решений пока нет …