Одной из возможных причин является то, что статическая переменная одинакова для всех моделей с производными данными, поэтому будет трудно отследить имя таблицы для производного типа.
class Base
{
public static $table;
}
class Derived1 extends Base { }
class Derived2 extends Base { }
Base::$table = "Table";
echo Derived1::$table;
echo Derived2::$table;
Здесь оба производных класса будут иметь одинаковое имя таблицы.
Кроме того, new static () создаст экземпляр класса, для которого был вызван метод.
class Base
{
public $table;
public static function create($table)
{
// Create instace of derived class
$instance = new static();
$instance->table = $table;
return $instance;
}
}
class Derived1 extends Base { }
class Derived2 extends Base { }
print_r(Derived1::create("Table1"));
print_r(Derived2::create("Table2"));
В этом случае каждый экземпляр будет иметь собственное свойство таблицы иДаже фабричный метод, который был в экземпляре базового класса, будет иметь тип, который был вызван.
Обновление Если вы хотите использовать статическую переменную в базовом классе и при этом иметь разные значения,вы бы использовали карту, где имя класса является ключом.
class Base
{
private static $table;
public static function create($table)
{
$instance = new static();
self::$table[get_class($instance)] = $table;
return $instance;
}
public function getTableName()
{
return self::$table[get_class($this)];
}
}
class Derived1 extends Base { }
class Derived2 extends Base { }
$d1 = Derived1::create("Table1");
$d2 = Derived2::create("Table2");
echo $d1->getTableName(); //prints Table1
echo $d2->getTableName(); //prints Table2