Re: How can I do the opposite of property_exists(), maybe a creat_property() in PHP5?
| From: | Daevid Vincent | Date: | Tue, 03 Feb 2009 19:52:43 +0000 |
| Subject: | Re: How can I do the opposite of property_exists(), maybe a creat_property() in PHP5? | ||
| References: | 1 2 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-287582@lists.php.net to get a copy of this message | ||
On Tue, 2009-02-03 at 08:30 +0100, Edmund Hertle wrote:
> 2009/2/3 Daevid Vincent <daevid@daevid.com>
>
> > Is there a way to create a new property via PHP 5.2.4?
> >
> > I get a hash back from an authentication server. I'm not guaranteed that
> > someone in another department won't add new key/values to the returned
> > hash/array. I'm trying to work around that part gracefully so that the
> > code doesn't blow up on a customer in such an event. The main try/catch
> > will suppress errors already, but I thought it would be nice to be able
> > to handle this stuff automatically rather than constantly updating a
> > User.class.php file all the time.
> >
> > "creating new property this->oraclecustomerid with 1122"
> >
> > but when I try to set the value with the $this->$pkey = $value;
> >
> > It triggers __call() which then triggers __set() which throws my
> > BadProperty exception.
> >
> > How come $this->$pkey = $value isn't creating/setting a property?
> > Or how do I do something like create_property($this, $pkey);
> > so that I can then set it via $this->oraclecustomerid = 1122 or
> > $this->set_oraclecustomerid(1122) ???
> >
> > <?php
> > function load_from_user_data($user_data)
> > {
> > //now loop through the rest of the user_data array and assign via a
> > set_foo() method
> > foreach ($user_data as $key => $value)
> > {
> > //try
> > {
> > $pkey = strtolower($key);
> > //[dv] this is sort of a hack to
> > "automatically" create a new
> > property/variable
> > // for 'new' hashes key/values we
> > may not know about.
> > // It's really designed to supress
> > errors and they really should
> > be added to this User.class.php properly.
> > if ( !property_exists($this, $pkey) )
> > {
> > echo "creating new property
> > this->$pkey with $value<br>\n";
> > $this->$pkey = $value; //THIS BLOWS
> > UP ON THE __set()
> > echo "this->$pkey = ".$this->$pkey;
> > }
> Hey,
> well, $this->$pkey is wrong syntax. Try $this->pkey = $value
No Eddie, it's one of the beautiful, simple and powerful things about
PHP.
http://www.php.net/manual/en/language.variables.variable.php
As I loop over the hash, i am TRYING to create a new class property of
the key and assigning it the value.
$pkey is basically the hash's $key in mixed case, forced to lowercase.
You can do this for variables and for functions/methods too. This is a
'factory'. I've used it for example for parsing an XML file and
operating on the data within various 'blocks' by reading the <block
name="foo" value="bar"> and then executing $$name($value).
Thanks for trying though. ;-)
> >
> > else
> > {
> > $class_variable = 'set_'.$pkey;
> > $this->$class_variable($value);
> > unset($user_data[$key]);
> > }
> > }
> > //catch (Exception $e)
> > {
> > //echo $e->getMessage()."\n";
> > }
> > }
> >
> > //should new fields be returned in the $user_data that are
> > not
> > accounted for above...
> > if ($_SESSION['DEVELOPMENT'] && count($user_data))
> > {
> > echo "<!-- Unaccounted for user_data hashes. Please
> > add these into
> > User.class.php:\n";
> > var_dump($user_data);
> > echo "-->";
> > }
> >
> > //THESE TWO LINES FATAL ERROR ON THE __get():
> > echo "this->oraclecustomerid = ".$this->oraclecustomerid;
> > echo "this->get_oraclecustomerid() =
> > ".$this->get_oraclecustomerid();
> > }
> > ?>
> >