On 06/01/2026 02:14, Stuardo -StR- Rodríguez wrote:
Hello internals,

I am writing to open the discussion for the RFC "use-from syntax for namespace use declarations":
https://wiki.php.net/rfc/use-from


Hi, and welcome!


As you say in the RFC, a new syntax like this "requires a clear and strong justification". Looking at the reasons given, I'm not convinced they pass that test. Let's look at them in order:



RATIONALE 1: "makes it easier to scan and (optionally) sort import lists by imported symbol"

At first glance, this seems like a reasonable idea, but there are two aspects of PHP's existing syntax which work against it. The first problem is the braced-list form for aliasing multiple symbols from one namespace. Taking the example from your RFC, grouping gives this:

```
use Carbon from Illuminate\Support;
use Inertia from Inertia;
use {SettingService,TaskService} from App\Services;
use {Status,Task,User} from App\Models;
use {TaskCreated,TaskUpdated} from App\Events;
use TaskRepository from App\Repositories;
use TaskUpdateData from App\DTOs;
use ZipArchive;
```

This is much more concise, but sorting no longer helps find a symbol (e.g. you have to read each entry to find "User"). Sorting by the first item in a group, as shown, is also unstable: importing "App\Models\Agent" would require moving the fourth line to the top of the list.

The second problem is custom aliases, which you propose not one but two new styles for, neither of which allow you to sort or scan by the symbol as used in the file.

The first variant actively harms scanning, putting the symbol we're looking for in the *middle* of the statement:

use TaskRepository as Repository from App\Repositories;

The second variant splits the real name and the alias to opposite ends of the line. The reader has to check both to see which symbol is actually being defined:

use TaskRepository from App\Repositoriesas Repository;

The existing syntax places the symbol being defined consistently at the end, next to the real name it is aliasing:

use App\Repositories\TaskRepositoryas Repository;



RATIONALE 2(a): "reducing cognitive friction for developers who regularly move between languages that already use a similar form"

This seems to fall down almost immediately, because you quote Python as an example, but it's not in the proposed order! In fact, JavaScript seems to be a rare outlier in placing the imported symbol first:

JavaScript: import { Widget } from "acme-lib";
Python: from acmeLib import Widget
Java: import AcmeLib.Widget;
C#: using AcmeLib.Widget;
Swift: import class AcmeLib.Widget
Kotlin: import AcmeLib.Widget
Scala: import AcmeLib.Widget
PHP: use AcmeLib\Widget;



RATIONALE 2(b): "makes the import semantics immediately recognizable to a wider audience"

As Ben Ramsey pointed out, the opposite is true: the semantics of "use" are *not* the same as JavaScript's "import", so making them look similar sets up false expectations. PHP's "use" statement does not load any code, and doesn't even need to refer to a real class; it is purely a compile-time rewrite rule, more similar to C's #define pre-processor macro.

Worse, JavaScript actually has two *different* import syntaxes which resemble the proposal:

import { Widget } from "acme-lib"
import Widget from "acme-lib"

The first is the one which superficially resembles a PHP "use" statement, while the second is actually a short-hand for this, which has no equivalent in PHP at all:

import { default as Widget } from "acme-lib"



RATIONALE 3: "projects that prefer namespace-first ordering can continue to do so"

Superficially, this is true; but having more than one way to write something has a non-zero cost.

First, every tool processing the language's syntax has to support the new syntax, even if only to enforce a coding standard that it should not be used.

Second, users will not immediately know that the different syntaxes mean the same thing. For instance, users frequently ask the difference between "exit" and "die": https://stackoverflow.com/questions/1795025/what-are-the-differences-in-die-and-exit-in-php

This is even more likely given the previous two points: the new syntax will look like JS, where the various different "import" syntaxes *do* mean different things. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/import



All things considered, if this is ever taken to a vote, I will vote No.

--
Rowan Tommins
[IMSoP]

Reply via email to