What are the best practices for structuring and accessing data in PHP classes like Zend_Db_Table_Abstract?

When structuring and accessing data in PHP classes like Zend_Db_Table_Abstract, it is best practice to separate the database logic from the business logic. This can be achieved by creating separate classes for data access and business logic, following the single responsibility principle. Additionally, using dependency injection to inject database adapters into the data access classes can help improve testability and maintainability.

// Data access class
class UserDataAccess {
    protected $db;

    public function __construct(Zend_Db_Adapter_Abstract $db) {
        $this->db = $db;
    }

    public function getUserById($id) {
        $select = $this->db->select()
            ->from('users')
            ->where('id = ?', $id);

        return $this->db->fetchRow($select);
    }
}

// Business logic class
class User {
    protected $userDataAccess;

    public function __construct(UserDataAccess $userDataAccess) {
        $this->userDataAccess = $userDataAccess;
    }

    public function getUserById($id) {
        return $this->userDataAccess->getUserById($id);
    }
}

// Example of how to use the classes
$db = new Zend_Db_Adapter_Pdo_Mysql($config);
$userDataAccess = new UserDataAccess($db);
$user = new User($userDataAccess);

$userData = $user->getUserById(1);