Skip to content

Deprecation errors are inconsistently triggered for underscore class aliases #18285

Closed

Description

@lpd-au

Description

The following code:

<?php

namespace Foo {
    class __ {}
}

namespace Bar {
    class _ {} // Deprecated
}

namespace {
    class __ {}
    
    class_alias('Foo\__', 'Foo\_'); // Is this meant to be deprecated?
    class_alias('__', '_'); // Deprecated
}

namespace Baz {
    use Foo\_;
}

namespace Qux {
    use Foo\__ as _; // Is this meant to be deprecated?
}

Resulted in this output:

Deprecated: Using "_" as a class name is deprecated since 8.4 in /in/ZZMJs on line 8

Deprecated: Using "_" as a class alias is deprecated since 8.4 in /in/ZZMJs on line 15

But I expected this output instead:

Deprecated: Using "_" as a class name is deprecated since 8.4 in /in/ZZMJs on line 8

Deprecated: Using "_" as a class alias is deprecated since 8.4 in /in/ZZMJs on line 14

Deprecated: Using "_" as a class alias is deprecated since 8.4 in /in/ZZMJs on line 15

Deprecated: Using "_" as a class alias is deprecated since 8.4 in /in/ZZMJs on line 23

I encountered this issue while trying to migrate a large closed source project to PHP 8.4. The namespaced _ class was used as a wrapper for the gettext _ function (eg new _("string")), to delay performing the translation of cached content until the http response is stringified. The class had ~35k instantiations in source control and more instances in compressed + serialized database records. This made class aliases a potentially appealing solution, but I understand from @Girgias that these not emitting deprecation errors is an oversight.

PHP Version

8.4.1 - 8.4.6 on 3v4l

Operating System

No response

Activity

  1. Girgias commented on Sep 30, 2026

    @Girgias
    Member

    This should be fixed now that #23615 is merged.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions