Chris W. Parker wrote: > Hello, > > I'm working on a project now and I'd like to get some feedback on how to > implement a proper class (or two). > > This is an application that records an employee's used vacation time. > There are two tables: (1) events, (2) users. > > Users: > > id (int) > name (varchar) > email (varchar) > balance (mediumint, stored in seconds) // this is the balance for > // the user after all events > // have been accounted for. > accrual (smallint, stored in seconds) > is_manager (bool) > > Events: > > id (int) > uid (int, users.id) > date (date) > duration (smallint, stored in seconds) > balance (smallint, stored in seconds) // this is the balance for > // the user at the time the > // event was added. > created (datetime) > > > Currently I have just one class called User that looks like this: > > > (I'm dealing with PHP4.) > > class User > { > var id; > var name; > var email; > var balance; > var accrual; > var is_manager; > > function User($user_id) > { > $this->id = $user_id; > $this->name = get_name(); > // ... > $this->accrual = get_accrual(); > } > > function get_name() > { > // get name from db > $sql = "..."; > > $db =& DB::singleton(); > $db->execute($sql); you probably only want one DB call to populate the User object with all the relevant user data at the point where the object is created. function User($user_id) { // check the user id properly? // see the getEmployee() example below for the // reason for the array usage if (is_array($user_id)) { $this->id = $user_id['id']; $this->load($user_id); } else { $this->id = $user_id; $this->load(); } } function load($data = null) { if (!is_array($data) || empty($data)) { // get user data from db $sql = "SELECT * FROM users WHERE id={$this->id}"; // error checking? $db =& DB::singleton(); $db->execute($sql); $data = $db->getRow(); } $this->name = $data['name']; $this->accrual = $data['accrual']; $this->email = $data['email']; /// etc } > > function get_email() > function get_accrual() > function is_manager() > { > // same as above more or less > } > > function get_events() > { > // this function gets all the events for > // the current users and returns them > // as an array. > } > > function add_event() > { > // this function adds a single event for > // the current user. it also recalculates > // the 'balance' for each event because > // of data display requirements. > } > > function del_event($event_id) > { > // delete an event from the current user's > // events list based on $event_id. > } > } > > > As I started to write this and use it I get the feeling that there > should also be an Event class that is extended by the User class. Reason if you use an Event class then it should just represent an Event (and a User object would [probably] contain an array of Event objects). AFAICT there is no good reason to have Event extend User. > being that each User object is a reference to the currently logged in > user, not anyone else. the User class is merely a representation of *a* user - you can use an instance for the currently logged in user, but that doesn't stop you from using the same class to model the collection of users that fall under a given manager. > But if you're a manager you have the > responsibility to approve/deny and/or add/delete events for your > employees. // you might need to f around with returning references here, // (I can never quite get that right without a bit of trial and error in php4) function getEmployees() { // consider caching the result? $emps = array(); if ($this->is_manager) { // get user data from db $sql = "SELECT * FROM users WHERE manager_id={$this->id}"; // error checking? $db =& DB::singleton(); $db->execute($sql); while ($data = $db->getRow()) $emps[] =& new User($data); } return $emps; } > > But with that in mind I've gone from a class that handles the currently > logged in user to one that handles the currently logged in user plus any > number of other users. > > I guess I'm thinking of this in the same terms as db normalization. Ex: > I could add an extra price_level column to my products table each time I > need a new pricing level but it's probably better to create a separate > table called products_prices. It's slightly more complicated but it > would allow me to have as many pricing levels as I want without > modifying my databse or code. > > > I'd appreciate any kind of feedback on this. If I haven't been clear > with something please let me know. > > > > Thanks, > Chris. > -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php