473,396 Members | 1,923 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,396 software developers and data experts.

Objects or not ?

Hi,

Im having a discussion with a friend about Objects.

Let say I create a user Object

class User
{
private $_aUserdata;
rivate $_sId;

function __construct($id)
{
$this->_sId=$id;
$this->_aUserdata= db::select('SELECT * FROM users WHERE UserId ="'.
$id.'"');
}

public function getName()
{
return $this->_aUserdata['firstnamename'].' '.$this-
>_aUserdata['lastname'];
}

function __destruct()
{
// just for this example
echo 'UPDATING USER';
$db::update('UPDATE users SET' lastsused="NOW()" WHERE UserId="'.$this-
>_sId.'"' );
}

}

Now i can have easy access to the users

$user=new User(1);
echo $user->getName();

// Arjen
// UPDATING USER

But no script I ever write is this simple.
Lets says that I want to select all forum entries and display the user
name along with the other data

$forumdata=$db::select('SELECT * FROM forum INNER JOIN USERS on
forum.UserId=users.UserId');

Now my userclass is completely useless because I allready have all the
data I need and I dont want to do another xxx select queries to the
user database. However i would still like to use User::getName()
because I might do some fancy calculation there and i dont want to
multpily my code. I now also dont have access to (the complpetely
useless) destructor so I have to update this manually.

How would I go and solve such a problem ?

I could imagine that I could loop through the forumdata and load the
user data into a new user object but is that really a good
solution ?

Arjen

Nov 13 '07 #1
9 1240
I could imagine that I could loop through the forumdata and load the
user data into a new user object but is that really a good
solution ?
Have a look at Propel or Doctrine.
Nov 13 '07 #2
fl*******@gmail.com wrote:
Hi,

Im having a discussion with a friend about Objects.

Let say I create a user Object

class User
{
private $_aUserdata;
rivate $_sId;

function __construct($id)
{
$this->_sId=$id;
$this->_aUserdata= db::select('SELECT * FROM users WHERE UserId ="'.
$id.'"');
}

public function getName()
{
return $this->_aUserdata['firstnamename'].' '.$this-
>_aUserdata['lastname'];
}

function __destruct()
{
// just for this example
echo 'UPDATING USER';
$db::update('UPDATE users SET' lastsused="NOW()" WHERE UserId="'.$this-
>_sId.'"' );
}

}

Now i can have easy access to the users

$user=new User(1);
echo $user->getName();

// Arjen
// UPDATING USER

But no script I ever write is this simple.
Lets says that I want to select all forum entries and display the user
name along with the other data

$forumdata=$db::select('SELECT * FROM forum INNER JOIN USERS on
forum.UserId=users.UserId');

Now my userclass is completely useless because I allready have all the
data I need and I dont want to do another xxx select queries to the
user database. However i would still like to use User::getName()
because I might do some fancy calculation there and i dont want to
multpily my code. I now also dont have access to (the complpetely
useless) destructor so I have to update this manually.

How would I go and solve such a problem ?

I could imagine that I could loop through the forumdata and load the
user data into a new user object but is that really a good
solution ?

Arjen

First of all, don't do the select in your code. Let your objects do it.

In this case, create a userlist class and let it perform the select
statement, building a new userobject for each row.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================

Nov 13 '07 #3
On 13 nov, 14:40, Jerry Stuckle <jstuck...@attglobal.netwrote:

Hi Jerry,
First of all, don't do the select in your code. Let your objects do it.
Yup just trying to make the point without producing tons of code :-)
In this case, create a userlist class and let it perform the select
statement, building a new userobject for each row.
Maybe I dont understand you but is what im trying to avoid. Lets say
$aData contains 1000 rows with unique UserId's. Then this code would
produce 1001 select queries.

function CreateUserObj()
{
$aData=$db::select('SELECT UserId FROM forum');

foreach ($aData as $val)
{
// executes a new select statement
$aUserObj[$val['UserId']]=new User($val['UserId']);
}

return $aUserObj;
}
Nov 13 '07 #4
On 13 nov, 14:27, Jonas Werres <jo...@example.orgwrote:
I could imagine that I could loop through the forumdata and load the
user data into a new user object but is that really a good
solution ?

Have a look at Propel or Doctrine
Cool !! This looks like a little overkill but the general idea is
really great !!

Thx Jonas !

Nov 13 '07 #5
fl*******@gmail.com wrote:
On 13 nov, 14:40, Jerry Stuckle <jstuck...@attglobal.netwrote:

Hi Jerry,
>First of all, don't do the select in your code. Let your objects do it.

Yup just trying to make the point without producing tons of code :-)
>In this case, create a userlist class and let it perform the select
statement, building a new userobject for each row.

Maybe I dont understand you but is what im trying to avoid. Lets say
$aData contains 1000 rows with unique UserId's. Then this code would
produce 1001 select queries.
But what you should be avoiding is having to worry about stuff like this
in your code. OO programming is all about abstracting the details.
function CreateUserObj()
{
$aData=$db::select('SELECT UserId FROM forum');

foreach ($aData as $val)
{
// executes a new select statement
$aUserObj[$val['UserId']]=new User($val['UserId']);
}

return $aUserObj;
}

No, this is one query, and you retrieve multiple rows from that query.

But if you need 1000 rows, you need to retrieve all 1000 rows somehow.
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================

Nov 13 '07 #6
On 13 nov, 15:13, Jerry Stuckle <jstuck...@attglobal.netwrote:
In this case, create a userlist class and let it perform the select
statement, building a new userobject for each row.
After re-reading your reply im guessing we are not talking about the
same thing. Im talking about a join of 2 tables: users and
forum(entries). Im not quite sure where the userlist fits in. I have
allready performed the select statement joing the two tables and I
have all the data I need. Ater getting all the data I need I would
like to make use of the handy classes I have created. Are you saying
that I should pass specific data from each row to 2 new objects (class
User and class Forum).

Arjen

Nov 13 '07 #7
On Nov 13, 8:23 am, floort...@gmail.com wrote:
Hi,

Im having a discussion with a friend about Objects.

Let say I create a user Object

class User
{
private $_aUserdata;
rivate $_sId;

function __construct($id)
{
$this->_sId=$id;
$this->_aUserdata= db::select('SELECT * FROM users WHERE UserId ="'.
$id.'"');

}

public function getName()
{
return $this->_aUserdata['firstnamename'].' '.$this-
_aUserdata['lastname'];
}

function __destruct()
{
// just for this example
echo 'UPDATING USER';
$db::update('UPDATE users SET' lastsused="NOW()" WHERE UserId="'.$this-
_sId.'"' );
}
}

Now i can have easy access to the users

$user=new User(1);
echo $user->getName();

// Arjen
// UPDATING USER

But no script I ever write is this simple.
Lets says that I want to select all forum entries and display the user
name along with the other data

$forumdata=$db::select('SELECT * FROM forum INNER JOIN USERS on
forum.UserId=users.UserId');

Now my userclass is completely useless because I allready have all the
data I need and I dont want to do another xxx select queries to the
user database. However i would still like to use User::getName()
because I might do some fancy calculation there and i dont want to
multpily my code. I now also dont have access to (the complpetely
useless) destructor so I have to update this manually.

How would I go and solve such a problem ?

I could imagine that I could loop through the forumdata and load the
user data into a new user object but is that really a good
solution ?

Arjen
There are lot's of different ways to do this. I typically create
static "factory" methods to create the objects rather than call the
constructor directly. For instance, your constructor can look like
this:

//Protected so you have to use the factory methods
protected function __construct($id, array $userData) {
$this->_sId = $id;
$this->_aUserdata = $userData;
}

Now you create a factory method called "fromID" like this:

public static function fromID($id) {
$class = __CLASS__;
$u = new $class($id, db::select('SELECT * FROM users WHERE UserId
="'.$id.'"'));
return $u;
}

And you can create a factory method called "fromArray" like this:

public static function fromArray(array $a) {
$class = __CLASS__;

$r = array();
foreach($a as $row)
$r[] = new $class($row['id'], $row);

return $r;
}

So, for a single id you can get your object like this:

$user = User::fromID(42);

And, if you already have the result of a query in an array, you can
get an array of user objects without re-running your query like this:

$forumdata = $db::select('SELECT * FROM forum INNER JOIN USERS on
forum.UserId=users.UserId');
$users = User::fromArray($forumdata);

Nov 13 '07 #8
fl*******@gmail.com wrote:
On 13 nov, 15:13, Jerry Stuckle <jstuck...@attglobal.netwrote:
>>>In this case, create a userlist class and let it perform the select
statement, building a new userobject for each row.

After re-reading your reply im guessing we are not talking about the
same thing. Im talking about a join of 2 tables: users and
forum(entries). Im not quite sure where the userlist fits in. I have
allready performed the select statement joing the two tables and I
have all the data I need. Ater getting all the data I need I would
like to make use of the handy classes I have created. Are you saying
that I should pass specific data from each row to 2 new objects (class
User and class Forum).

Arjen

Yes, UserList would be a list of users. It would perform the SQL
operations to fetch the information and then create a new User object
for each user returned.

And if one User could have many Forum entries, the User class should
contain a list of ForumEntry class objects. The UserList object would
handle this, also (in conjunction with the User object).

--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================

Nov 13 '07 #9
fl*******@gmail.com wrote:
On 13 nov, 15:13, Jerry Stuckle <jstuck...@attglobal.netwrote:
>>>In this case, create a userlist class and let it perform the select
statement, building a new userobject for each row.

After re-reading your reply im guessing we are not talking about the
same thing. Im talking about a join of 2 tables: users and
forum(entries). Im not quite sure where the userlist fits in. I have
allready performed the select statement joing the two tables and I
have all the data I need. Ater getting all the data I need I would
like to make use of the handy classes I have created. Are you saying
that I should pass specific data from each row to 2 new objects (class
User and class Forum).

Arjen

As an example:

class User {
private $userId;

function __construct($userId = null) { // To allow for a new user
$this->userId = $userId;
}

function getUserId() {
return $this->userId;
}

function setUserId($userId) {
// Validate it as necessary
// You can also return true/false depending on if
// validation succeeds or fails
$this->userId = $userId;
}

// ... other functions
}

class UserList {
private $users;

function __construct () { // Initialize the array
$users = array();
}

function fetchForumUsers($db) {
$userIds=$db::select('SELECT UserId FROM forum');
foreach ($userIds as $userId) {
// This does NOT execute a new SELECT statement!
$this->users[]=new User($userId);
}

function fecthUsers() {
return $this->users;
}
// ... other functions
// I often also add first(), last(), next() and prev() functions here
}

$userList = new UserList();
$userList->fetchForumUsers();
$users = $userList->fetchUsers();
--
==================
Remove the "x" from my email address
Jerry Stuckle
JDS Computer Training Corp.
js*******@attglobal.net
==================

Nov 13 '07 #10

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

2
by: dasod | last post by:
I would like to know if my method to remove list objects is correct in this small test program. It seems to me that there might be a simplier way, but I'm afraid I don't know enough about list...
9
by: Aguilar, James | last post by:
Hey guys. A new question: I want to use an STL libarary to hold a bunch of objects I create. Actually, it will hold references to the objects, but that's beside the point, for the most part. ...
6
by: Alfonso Morra | last post by:
I have written the following code, to test the concept of storing objects in a vector. I encounter two run time errors: 1). myClass gets destructed when pushed onto the vector 2). Prog throws a...
3
by: ytrewq | last post by:
Should dynamic ("expando") properties be restricted to native and user-defined objects? Or should host objects - such as references to the browser or a plug-in or to the document and its elements -...
8
by: Lüpher Cypher | last post by:
Hi, Suppose we have a hierarchical class structure that looks something like this: Object | +-- Main | +-- Object1
161
by: KraftDiner | last post by:
I was under the assumption that everything in python was a refrence... so if I code this: lst = for i in lst: if i==2: i = 4 print lst I though the contents of lst would be modified.....
7
by: Jo | last post by:
Hi, How can i differentiate between static and dynamic allocated objects? For example: void SomeFunction1() { CObject *objectp = new CObject; CObject object;
21
by: George Exarchakos | last post by:
Hi everyone, I'd like your help... Can we have a std::list<BASEwhere BASE be the base class of a class hierarchy? I want to add to this list objects that are inherited from BASE class but not...
27
by: SasQ | last post by:
Hello. I wonder if literal constants are objects, or they're only "naked" values not contained in any object? I have read that literal constants may not to be allocated by the compiler. If the...
14
by: Jess | last post by:
Hello, I learned that there are five kinds of static objects, namely 1. global objects 2. object defined in namespace scope 3. object declared static instead classes 4. objects declared...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
marktang
by: marktang | last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
Oralloy
by: Oralloy | last post by:
Hello folks, I am unable to find appropriate documentation on the type promotion of bit-fields when using the generalised comparison operator "<=>". The problem is that using the GNU compilers,...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
0
tracyyun
by: tracyyun | last post by:
Dear forum friends, With the development of smart home technology, a variety of wireless communication protocols have appeared on the market, such as Zigbee, Z-Wave, Wi-Fi, Bluetooth, etc. Each...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.