Hello Gregory,

Tuesday, November 4, 2008, 5:15:35 PM, you wrote:

> Christian Schneider wrote:
>> Lukas Kahwe Smith wrote:
>>> one could also do
>>> 1) ns
>>> 2) global
>>> 3) autoload
>> 
>> I'm in favour of this (if it avoids performance problems) as I don't see
>> a problem with giving global priority over autoload.

> Hi,

> This is the current name resolution.  The problem is that:

> <?php
> namespace foo;
> $a = new Exception();
?>>

> will instantiate foo::Exception only if the class already exists, but
> will instantiate Exception otherwise.  This defeats autoload's purpose
> for existing.  We've been over this before.  It's dangerous.

> There is one essential difference between classes and
> functions/constants: autoload.

> The only time the question of load order and fallback becomes and issue
> is when code is not explicitly loaded.  In other words, a developer who
> is relying upon an external function will do this at some point before
> calling the function:

> <?php
> include 'path/to/code/containing/function/source.php';
?>>

> In other words, PHP expects you to actually load the source of functions
> or constants you're going to be using in advance of using it.

> This, I believe, is a reasonable expectation.

> Classes, however, do *not* share this same expectation, because
> autoload's explicit purpose is to allow using classes *before* their
> source has been loaded.

> In other words, it is perfectly all right to have a different name
> resolution for classes than we have for functions and constants because
> of this different expectation.  It is dangerous to fallback for classes
> prior to autoload, but it is not at all dangerous for
> functions/constants because the expectation is different.

> For this reason, the only resolution that we should be considering is:

> classes:
> 1) try ns::class
> 2) autoload ns::class
> 3) fail

Since we can stack autoload we could provide a c-level autoload function
that does the default lookup.

function global_autoload($name) {
  if (($p = strrpos($name, '\\')) !== false) {
    $name = substr($name, $p);
    if (__NAMESPACE__ == substr($name, 0, $p -1) && class_exists("\\$name")) {
      use "\\$name";    // if we find a way to do this at C-levle
    }
  }
}

> functions/constants:
> 1) try ns::function/ns::const
> 2) try internal function/const
> 3) fail.

> Note that I say "try internal" because the only purpose behind allowing
> this is to make it easier to use PHP's built-in functionality.  Any
> userspace stuff should be specifically \prefixed or imported via use.
> And (yes) we need import for functions.

> Greg

> P.S. my mail server has been down for almost a week, apologies to anyone
> who is wondering why I haven't replied to your message, I probably
> didn't get it.




Best regards,
 Marcus


-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to