On Tuesday 04 December 2007, Derick Rethans wrote:

> 4. What is wrong with simple prefixes in the first place? Both PEAR_*,
>    Zend_*, ezc*, and ezp* are perfectly acceptable markers for different
>    'namespaces'.  We could optionally create a registry on php.net for
>    this to avoid conflicts.

Although most people on the list seem to be coming at this problem assuming 
classes, I want to offer a counter-example that is all functions.

In Drupal, our plugin architecture is based on function naming.  When a given 
event "omg" occurs, something akin to the following frequently happens (a bit 
simplified):

$hook = 'omg';
foreach ($modules_that_are_loaded as $module) {
  $function = $module .'_'. $hook;
  if (function_exists($function)) {
    $return[] = $function();
  }
}
return $return;

It's a very powerful mechanism, and quite flexible.  The one thing it doesn't 
offer is, given a function name, determine what module and hook/event it is 
for.  That's because we use PHP core coding standards, which say to use 
function_name for all functions.  So given this function name:

views_do_stuff()

Is that the "do stuff" hook from the "views" module/plugin, or the "stuff" 
hook from the "views_do" module?  Excellent question, and one that cannot be 
reliably solved.  (There is a module called "views", but nothing is stopping 
anyone from writing a "views_do" module and declaring their own "stuff" 
hook.)

That has actually come up recently as a problem, where we had to change the 
way a feature was implemented in order to avoid that problem of lack of 
introspection.  (Ironically, it was when we were trying to implement lazy 
loading of a larger number of files to *improve* performance by reducing the 
amount of parsed-but-unused code we have.)  We also are more and more coming 
across very_long_function_names since the function name must begin with the 
name of the module, which, if multi-word, can get quite long.

When I saw the namespaces implementation, I realized that was a good solution 
to the problem.  Instead of $module .'_'. $hook, use $module .'::'. $hook.  
That doesn't use namespaces as an alias or a shortener, but as, genuinely, a 
namespace.  

That's what's wrong with Long_Name_Prefixes.  Aside from being a bitch to type 
or read, they don't contain as much introspective metadata as namespaces do.  
A registry on php.net to avoid collisions solves the problem for only one 
tiny sliver of use cases.

If the problem with the current namespace implementation is that it doesn't go 
far enough, then the answer is not to drop it entirely but to finish it.  
Even if it's not useful in every use case, there are a lot of use cases where 
it is useful.  

To the other items raised:

1) "use MyDate as DateTime".  I believe Greg pointed out the solution here.  
When PHP 5.5 is released and adds its own Whatever class, you just do the 
following:

namespace me;
use Whatever as LegacyWhatever;
class Whatever{}

It's a one-line change to keep your code working.  I think that's acceptable, 
especially if we ensure that Whatever not existing in the global namespace 
(on 5.4) doesn't cause an error.  As Stanislav noted, a complete solution is 
impossible.  The Global namespace is a namespace, and you can't add things to 
a namespace and expect there to never be a collision within that namespace.  
Duh. :-)

2) No "use Foo::* as *".  I can certainly see where that would be useful, but 
the lack of it does not mean that the entire namespace implementation must be 
thrown out.  It still offers other benefits, even if it's not perfect (see 
above), and I don't see where adding * capabilities in a later version would 
cause a BC break syntactically, so worst case it's added later.

3) namespace keyword vs. {}.  I've already said before that I prefer the {} 
syntax for consistency with other constructs.  I am less bothered by the 
one-namespace-per-file rule than some, perhaps because I prefer to only parse 
the code I need rather than loading everything.  (In my common use case, 
Drupal, that's a bigger performance win than vice versa.)  I do agree that IF 
multiple namespaces are allowed in one file, {} makes a lot more syntactic 
sense than just a keyword.  That said... is the keyword vs. {} issue worth 
deep sixing namespaces completely?  If so, um, let's switch to {} (with or 
without multiple namespaces per file) and solve the problem? :-)

For whatever the opinion of someone who writes PHP all day and not C is worth, 
there it is.

-- 
Larry Garfield                  AIM: LOLG42
[EMAIL PROTECTED]               ICQ: 6817012

"If nature has made any one thing less susceptible than all others of 
exclusive property, it is the action of the thinking power called an idea, 
which an individual may exclusively possess as long as he keeps it to 
himself; but the moment it is divulged, it forces itself into the possession 
of every one, and the receiver cannot dispossess himself of it."  -- Thomas 
Jefferson

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

Reply via email to