Кусок базовой модели:
abstract class Model
{
# какой-то код
private static function table()
{
$class_name = basename(str_replace('\\', '/', static::class));
return '`' . strtolower(preg_replace('~(?<!^)[A-Z]~', '_$0', $class_name)) . '`';
}
/** @return static */
public static function findOne($id)
{
return current(Db::pdo('select * from ' . self::table() . ' where `id` = ?', [
$id
], static::class));
}
# какой-то код
}
Применение:
class TestModel extends Model
{
/*
* При создании экземпляра этого класса либо при обращении к его статическим методам
* мы методом table() базовой модели обращаемся к таблице `test_model`
*/
}
Если честно, то лень тестить, НО ЕМНИП вот так не работало где-то (не помню точно на винде или линях):
private static function table()
{
return '`' . strtolower(preg_replace('#(?<!^)[A-Z]#', '_$0', basename(static::class))) . '`';
}
поэтому был сделан фокус:
$class_name = basename(str_replace('\\', '/', static::class));
Вопрос: можно ли избавиться от str_replace(), применима ли константа DIRECTORY_SEPARATOR в данном случае?
Если можно, то как это запилить всё?