Hello

The current autoloading feature in symfony is based on class and
interface detection within project and symfony source files.
The detection is made with a regexp on the source code of these files
(in the file lib/config/sfAutoloadConfigHandler.class.php).

Current code :

$regex = '~^\s*(?:abstract\s+|final\s+)?(?:class|interface)\s+(\w
+)~mi';
foreach ($files as $file)
{
        preg_match_all($regex, file_get_contents($file), $classes);
        foreach ($classes[1] as $class)
        {
                ...
        }
}

This code can lead to some problems. Indeed if we consider the
following source code, the results will be wrong :
<?php

class myClass {
}
/*
class myOldClass {
}
*/

?>

myOldClass is going to be detected, though it should not be, because
inside a comment block. I think we can easily find other examples.


I think we could improve the detection using PHP token system.
Here is a function I made to detect correctly (I presume) classes and
interfaces within a source code :

/**
 * Get names of classes and interfaces defined within PHP code.
 *
 * @param string Source code to analyze
 *
 * @return array Names of the classes and interfaces defined in the
source code
 */
function getClasses($code) {
        $classIn = false;
        $classes = array();
        foreach(token_get_all($code) as $c) {
                if(is_array($c)) {
                        switch($c[0]) {
                                case T_CLASS:
                                case T_INTERFACE:
                                        $classIn = true;
                                        break;

                                case T_STRING:
                                        if($classIn) {
                                                $classes[] = $c[1];
                                                $classIn = false;
                                        }
                                        break;
                        }
                }
        }
        return $classes;
}

Defining this function as a method of the sfAutoloadConfigHandler
class (not sure whether it is the right place to define it), the
current code could be replace with the following one :

foreach ($files as $file)
{
        foreach (self::getClasses(file_get_contents($file)) as $class)
        {
                ...
        }
}

Tell me what you think about it ;)

Eric


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"symfony developers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/symfony-devs?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to