Hi,

On Mon, Jul 28, 2014 at 5:58 AM, Yasuo Ohgaki <yohg...@ohgaki.net> wrote:
> Hi all,
>
> Since we have discussion for Next PHP, "PHP" namespace discussion would be
> nice
> to have.
>
> Currently, PHP module functions/classes/interfaces are using global(root)
> namespace.
> If it is changed to use its own namespace, user space APIs may be changed
> flexible and user controlled manner. Thus, PHP may have
>
>  - Consistent naming
>  - Consistent parameter order
>  - Graceful function/class/interface deprecation
> (We know what we should do for these, right?)
>
> without much compatibility issues.
>
>
> "PHP" namespace may be used to provide PHP(and 3rd party)
> functions/classes/interfaces/constants.
> "PHP\Legacy" (or whatever) may be used for legacy
> functions/classes/interfaces/constants.
>
> From PHP 5.6, userland function aliasing can be done with namespace.
> Following code overrides existing function.
>
> <?php
> use function \mb_strlen as strlen;
> var_dump(strlen('日本語'));
> ?>
>
> Result:
> int(3)
>
> It's good to use prefered API, but it requires "use" for every function
> APIs to be overridden.
> Note: Classes/Interfaces may override by "use" one by one also.
>
> With "PHP" and "PHP\Legacy" namespace, user may write:
>
> <?php
> namespace PHP; // Use current PHP functions/classes/interfaces/constants
>
> // Code uses current API
> ?>
>
> <?php
> namespace PHP;
> namespace PHP\Legacy; // Override with legacy PHP
> functions/classes/interfaces/constants.
>
> // Code uses legacy API
> ?>
>
> For compatibility, default namespace setting would be nice to have.
>   - None for compiled default
>   - "PHP" for php.ini-*
>
> Previous example codes became:
>
> <?php
> // Code uses current API
> ?>
>
> <?php
> namespace PHP\Legacy; // Override with legacy PHP
> functions/classes/interfaces/constants.
> // Code uses legacy API
> ?>
>
> Issue would be codes that assume PHP functions/classes/interfaces/constants
> are
> defined in global(root) namespace. (e.g. \strlen()) This could be
> workaround by allowing
> "use"  aliasing to global(root) namespace. (e.g. "use PHP\Legacy as \;") In
> this case,
> current functions/classes/interfaces may stay in global(root) namespace.
> (or "use PHP as \;")
>
>
> Programmers may shoot their own foot by this. This is the trade off of
> flexibility.
>
> Any thoughts and/or comments?
>
> Regards,
>
> --
> Yasuo Ohgaki
> yohg...@ohgaki.net

This would be a major BC break, that couldn't possibly happen in PHP
5.x and IMO is way too radical even for PHP 6/7.

I generally hate to see statements like "this is not the PHP way", but
that's exactly the case with your proposal - it _enforces_ a more
strict way of programming. One must absolutely not be required to use
namespaces for everything.

Cheers,
Andrey.

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

Reply via email to