Hey there! I'm thrilled since this is my first proposal. I'd like to propose a new visibility schema for classes, based on a explicit group of namespaces allowed to use the class. The goal of this proposal is to provide a way to cover from a native language feature what currently is usually patched using "@internal" annotations. If the visibility declaration ("internals" in this example) is present, the class could only be visible for other classes on the list of the specified namespaces.
<?php namespace Vendor\Library\Feature; final class Foo implements Vendor\Library\InternalInterface internals Vendor\Library, Partner\VendorBridge { } /// this class will be allowed to use `Vendor\Library\Feature\Foo` because it is declared directly at `Vendor\Library` namespace <?php namespace Vendor\Library; use Vendor\Library\Feature\Foo; class Allowed { public function __construct() { new Foo(); } } /// this class will be allowed to use `Vendor\Library\Feature\Foo` because it one level under `Vendor\Library` namespace <?php namespace Vendor\Library\Service; use Vendor\Library\Feature\Foo; class Allowed { public function __construct() { new Foo(); } } /// this class will NOT be allowed to use `Vendor\Library\Feature\Foo`, since the current namespace `Vendor` doesn't match and is not under `Vendor\Library` nor `Partner\VendorBridge`. <?php namespace Vendor; use Vendor\Library\Feature\Foo; class Disallowed { public function __construct() { new Foo(); } } I think a good example of the kind of project that can leverage this feature are the libraries which expose a public API with its own implementation, but need to protect their internal classes in order to avoid them to be tied to their BC promise. Note that I really don't know how to implement this internally, or if this must be just related to the autoload mechanism instead of a (maybe) more complex compilation phase. Please, let me know if you have some concerns or doubts about it. Thank you in advance. -- Javier Spagnoletti