On 30 May 2025, at 18:38, Rowan Tommins [IMSoP] <[email protected]> wrote:
>
> On 30 May 2025 08:57:34 BST, Rob Landers <[email protected]> wrote:
>>
>> I’m starting to think that maybe modules might be a bad idea; or at least,
>> class/module visibility.
>>
>> As an anecdote, I was looking to extract a protobuf encoding library from a
>> larger codebase and create a separate library for Larry’s Serde library.
>> During the extraction I realized that many of the classes and functions I
>> was relying on actually used @internal classes/functions. If “module”
>> visibility were a thing… would my implementation have been possible?
>>
>> In other words, if visibility comes with modules; there really needs to be
>> some kind of escape hatch. Some way to say, “I know what I’m doing, so get
>> out of my way.”
>
>
> Isn't this exactly the same as any other "access control" feature?
>
> We have private/protected methods and properties, final methods and classes,
> readonly properties; other languages also have sealed classes, module and/or
> file private, etc. All of these are ways for the author of the code to
> express how they intend it to be used, and to protect users against
> *accidentally* violating assumptions the code is relying on.
>
> They are of course not *security* measures, as they can be bypassed via
> Reflection or just editing the source code.
>
> If you're using someone else's code in ways they didn't intend, that's up to
> you, but you may need to make changes to do so, i.e. fork it rather than
> relying on the distributed version.
If the goal is to hint consumers of a library about the (lack of) guarantees
regarding a method or its signature, then perhaps an `#[\Internal]` attribute
makes sense.
```php
namespace Acme\Foo;
class Foo
{
#[\Internal('Acme')]
public function bar() { /* ... */ }
}
```
In the example above, I image calling or extending the `Foo::bar()` method from
somewhere outside the `Acme` namespace would trigger an E_USER_WARNING or
E_USER_NOTICE. The warning/notice could then be suppressed when explicitly
overriding an `#[\Internal]` method with `#[\Override]`.
Alwin