Это просто потому, что $db
и $stmt
- это разные типы объектов.$db
является объектом соединения PDO , представляющим соединение с базой данных, а $stmt
является объектом оператора PDO , представляющим конкретный подготовленный запрос (или «оператор»).
Когда вы пишете $stmt = $db->prepare("...");
, вы не «сохраняете $ db в $ stmt» (как вы это описали), это не то, что здесь происходит.Происходит то, что вы выполняете метод с именем prepare () , который доступен в объекте соединения.Это подготовит ваш SQL к выполнению и поместит его в объект Statement, который затем вернет вам.Это то, что заканчивается в переменной $stmt
.
Затем, чтобы связать параметры и выполнить запрос, методы для этого являются частью объекта Statement (и это логично, потому что вы выполняете оператор - вы не выполняете соединение).$db->bindParam();
не работает, потому что в объекте Connection такого метода нет, и не должно быть - вы напрямую связываете параметры с оператором.
Ничего сложного, странного или нелогичного здесь не происходит - это простослучай метода в одном классе, возвращающий экземпляр другого класса, который имеет другой набор доступных методов (потому что у него другое назначение).
Прочитайте ссылки на документацию, которые я предоставил, и, надеюсь, вы 'Я начну понимать структуру и то, как различные классы и методы связаны друг с другом.