Dynamic class variables

Does PHP have a method for automatically creating class variables? I think I saw something like this before, but I'm not sure.

public class TestClass { private $data = array(); public function TestClass() { $this->data['firstValue'] = "cheese"; } } 

The $this->data array is always an associative array, but they vary from class to class. Is there a viable way to access $this->data['firstValue'] from $this->firstValue without specifying a link?

And if so, are there any flaws?

Or is there a static method for defining a link in a way that won't explode if the $this->data array does not contain this key?

+6
oop php
source share
2 answers

See here: http://www.php.net/manual/en/language.oop5.overloading.php

What you want is the __get method. There is an example of what you need by reference.

+12
source share

Use PHP5 "magic" __get() . It will work as follows:

 public class TestClass { private $data = array(); // Since you're using PHP5, you should be using PHP5 style constructors. public function __construct() { $this->data['firstValue'] = "cheese"; } /** * This is the magic get function. Any class variable you try to access from * outside the class that is not public will go through this method. The variable * name will be passed in to the $param parameter. For this example, all * will be retrieved from the private $data array. If the variable doesn't exist * in the array, then the method will return null. * * @param string $param Class variable name * * @return mixed */ public function __get($param) { if (isset($this->data[$param])) { return $this->data[$param]; } else { return null; } } /** * This is the "magic" isset method. It is very important to implement this * method when using __get to change or retrieve data members from private or * protected members. If it is not implemented, code that checks to see if a * particular variable has been set will fail even though you'll be able to * retrieve a value for that variable. * * @param string $param Variable name to check * * @return boolean */ public function __isset($param) { return isset($this->data[$param]); } /** * This method is required if you want to be able to set variables from outside * your class without providing explicit setter options. Similar to accessing * a variable using $foo = $object->firstValue, this method allows you to set * the value of a variable (any variable in this case, but it can be limited * by modifying this method) by doing something like: * $this->secondValue = 'foo'; * * @param string $param Class variable name to set * @param mixed $value Value to set * * @return null */ public function __set($param, $value) { $this->data[$param] = $value; } } 

Using the magic constructors __get , __set and __isset will allow you to control how you want the variables to be set in the class, storing all the values ​​in a single array.

Hope this helps :)

+7
source share

All Articles