Что-то многовато таких вопросов за последние пару дней. Часть замечаний к вашему коду есть в
этом ответе. Повторюсь.
Вы же сами написали:
класс для работы с многомерными пользовательскими массивами
но, тем не менее, этот класса делает все, что не лень:
- Работает с этими самыми массивами
- Соединяется с базой данных
- Отправляет запросы к базе данных
- Занимается обработкой данных
Не многовато ли для одного класса?
В итоге, мы получаем богообъект, который "умеет во всё".
Что у вас за бред написан в методе getInstance()? Зачем бросать исключение, в случае, если инстанс уже был создан.
if (self::$_instance === null) {
self::$_instance = new self($id);
} else {
throw new Exception("Попытка повторного создания экземпляра Singleton класса");
}
return self::$_instance;
То есть, у вас теряется весь смысл (анти)паттерна синглотон. Получается, я не смогу сделать так:
$instance1 = treeData::getInstance();
$instance2 = treeData::getInstance(); // Исключение!
Есть логика? Я думаю, что нет.
Почему вы храните данные для соединения с БД внутри метода? Не логично ли было бы передавать их в качестве аргументов к методам?
Вы каждый раз повторяете строки с подготовкой запроса, биндингом параметров, отправкой запроса и тд. Не думали, что неплохо бы было написать какую-нибудь обертку и выполнять запросы как-нибудь так:
$result = $wrapper->select("SELECT * FROM `tablename` WHERE `id` = :id", ['id' => 5]);
?
Абстрактные исключения не бросаем! Создаем свои исключения и наследуемся от них. В своем коде используем только их, дабы можно было легко обработать нужные exception'ы. Текст исключения неплохо бы было писать на английском.
Имена классов пишем с большой буквы! Скобки после методов и классов пишем на новой строке:
function example() {
// Не так
}
function example()
{
// А вот так
}
Предлагаю придерживаться общепринятым стандартам оформления кода.
Старайтесь использовать синглтон в таком виде по минимуму (Или вообще не использовать). Тем более, в данном случае, он вообще не нужен.