Hi all.
Maybe I'm wanting more Java-like functionality out of PHP, but I don't
really like getting and setting members directly (even for public
members) - I'd rather use accessors. This way you can control what is
getting set and what is returning. However, I also don't really want
to create a million get/set accessor methods - this is no fun and
takes up a lot of space. After reading around a little bit, it got me
thinking about overloading in PHP (which I'm sure we all know is
completely different than any other language... but that's another
day). I didn't want to use the standard __get and __set methods
because that still leaves me with the same notation for getting/
setting members. So, instead, I used a close relative of __get and
__set. Meet brother __call. Could it really be this trivial to get the
notation I'm wanting? Yes. Yes it is. Ok, enough talking... onto the
code.
<?php
class Person
{
public $age;
private $first, $middle, $last;
// Gotta have our construct
public function __construct () {}
// Here's the fun
public function __call ($member, $args)
{
// Since I know members I want, force the user to only
// access the ones I've created
if (property_exists ('Person', $member)) {
// If args is empty, I must be returning the value
if (empty ($args)) {
list ($value) = $this->$member;
return $value;
}
// Oh, args is not empty! Set the value
$this->$member = $args;
}
else {
// Blow up!
die ("Fatal Error: Call to undefined member: $member.
Exiting...");
}
}
}
$person = new Person();
// Set the (private) first and last names
$person->first('Billy');
$person->last('Bob');
// Get the (private) first and last names
echo $person->first() . " " . $person->last()."<br/>";
// Set the (public) age
$person->age(103);
// Get the (public) age
echo "Age: ".$person->age()."<br/>";
// Explosions
$person->first = 'Buford';
$person->pizza('Is yummy');
?>
Now if you're reading this and thinking "Duh!" then good for you.
However, I know there's at least 1 soul on this list who may benefit
from this. But don't stop at the example above. If you want to add
validation to the members you're getting/setting, build that into your
code. If you want each member to be a specific type, include that as
well (I'll leave the implementation up to you). ;-)
So let's recap.
• This functionality allows me to not have to write 2 accessors for
every member
• This allows me to use methods instead of directly getting/setting
members (even though I can still access public members directly... if
I want)
• Keeps code consistent and less confusing - I know how to get and
set every member
What are your thoughts? Does this seem like a reasonable
implementation? Useful? Pointless? Hit me up - I can handle
*constructive* criticism. But for now, it's late and past my bedtime.
Cheers,
~Philip
"innerHTML is a string. The DOM is not a string, it's a hierarchal
object structure. Shoving a string into an object is impure and
similar to wrapping a spaghetti noodle around an orange and calling it
lunch."
--
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php