Forums / Discussions / Support of namespace

Tuesday 23 August 2011 7:14:12 am

» Back to Roadmap

Description

eZ 4.4 has to be used with PHP 5.2 at least. With the major version 5.3, namespaces became available in PHP. Unfortunatly we can't use them in eZ Publish.

Whether eZ Core classes use namespaces or not, developpers can't also use them whereas there isn't much to do to make namespaces available.

We only need to add few lines in the file 'kernel/private/classes/ezautoloadgenerator.php'. Using the php function token_get_all provides an array with parsed elements of the file.

For a namespace, PHP use the constant T_NAMESPACE. To ensure that our code is compatible in PHP 5.2, we need to define the constant in that version. To do such thing, we only need to add line 436 the following code :

        $this->setStatArray( self::OUTPUT_PROGRESS_PHASE2, $statArray );
        $this->startProgressOutput( self::OUTPUT_PROGRESS_PHASE2 );

+        $aPhpVersion = explode('.', phpversion());
+        if ($aPhpVersion[1] 3)
+        {
+            !defined('T_NAMESPACE') && define('T_NAMESPACE', 377);
+        }

        foreach( $fileList as $file )

For each file we set a namespace variable to an empty string :

+             $sNameSpace = '';
            $tokens = @token_get_all( file_get_contents( $file ) );

Then we get the namespace in the switch

                     switch( $token[0] )
                    {
+                        case T_NAMESPACE:
+                            $sNameSpace = '';
+                            for ($i = $key+2; $i count($tokens)-1; $i++)
+                            {
+                                if (is_array($tokens[$i]) && T_STRING == $tokens[$i][0])
+                                {
+                                    $sNameSpace .= $tokens[$i][1].'\\';
+                                }
+                                else if (!is_array($tokens[$i]) && in_array($tokens[$i], array(';', '{')))
+                                {
+                                    break;
+                                }
+                            }
+                            break;

And finally we add the namespace before the class name, the autoload function will automaticly load the class

-                             $className = $tokens[$key+2][1];
+                            $className = $sNameSpace.$tokens[$key+2][1];

What do you think about it ?

No reply yet!

You must be logged in to post messages in this topic!