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

Reply via email to