It is possible (I will benchmark it on my own project) but the result
of the detection is directly cached in the following file :
ROOT_DIR/cache/APP/ENV/config/config_autoload.yml.php file.
So there is no problem for production performance.
In this case, I think that the reliability of the detection system in
more important than performance (as long as it does not take hours to
perform ;)).
Eric
On 10/15/07, Olivier Mansour <[EMAIL PROTECTED]> wrote:
>
>
> Le 15 oct. 07 à 14:51, Eric Lemoine a écrit :
>
> >
> > 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 ;)
>
> My intuition is telling me that this way is much slower than the
> regexp based code :-(
>
> Olivier
>
> >
> > Eric
> >
> >
> > >
>
>
>
> --
> Olivier Mansour
> [EMAIL PROTECTED]
> http://www.glagla.org
>
>
>
> >
>
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---