7.14.1 Problem
You want to instantiate an object, but you don't know the
name of the class until your code is executed. For example, you want to localize
your site by creating an object belonging to a specific language. However, until
the page is requested, you don't know which language to select.
7.14.2 Solution
Use a variable for your class name:
$language = $_REQUEST['language'];
$valid_langs = array('en_US' => 'US English',
'en_GB' => 'British English',
'es_US' => 'US Spanish',
'fr_CA' => 'Canadian French');
if (isset($valid_langs[$language]) && class_exists($language)) {
$lang = new $language;
}
7.14.3 Discussion
Sometimes you may not know the class name you want to
instantiate at run-time but you know part of it. For instance, to provide your
class hierarchy a pseudo-namespace, you may prefix a leading series of
characters in front of all class names; this is why we often use pc_ to
represent PHP Cookbook or PEAR uses Net_
before all Networking classes.
However, while this is legal PHP:
$class_name = 'Net_Ping'; $class = new $class_name; // new Net_Ping
This is not:
$partial_class_name = 'Ping'; $class = new "Net_$partial_class_name"; // new Net_Ping
This, however, is okay:
$partial_class_name = 'Ping'; $class_prefix = 'Net_'; $class_name = "$class_prefix$partial_class_name"; $class = new $class_name; // new Net_Ping
So, you can't instantiate an object when its class name is
defined using variable concatenation in the same step. However, because you can
use simple variable names, the solution is to preconcatenate the class name.