PHP Classes and Objects Instantiating an Object Dynamically - Supercoders | Web Development and Design | Tutorial for Java, PHP, HTML, Javascript PHP Classes and Objects Instantiating an Object Dynamically - Supercoders | Web Development and Design | Tutorial for Java, PHP, HTML, Javascript

Breaking

Post Top Ad

Post Top Ad

Monday, May 27, 2019

PHP Classes and Objects Instantiating an Object Dynamically

PHP Classes and Objects




Instantiating an Object Dynamically

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.

Solution

Use a variable for your class name:   

         $language = $_REQUEST['language'];
         $valid_langs = array('en_US' => 'US English',
                                                 'en_UK' => 'British English',
                                                 'es_US' => 'US Spanish',
                                                  'fr_CA' => 'Canadian French');

         if (isset($valid_langs[$language]) && class_exists($language)) {
              $lang = new $language;
         }

Discussion

Sometimes you may not know the class name you want to instantiate at runtime, but you know part of it. However, although 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.


No comments:

Post a Comment

Post Top Ad