Re: [Discussion] "Internal" attribute and warning
| From: | Robert Landers | Date: | Sat, 18 May 2024 15:25:06 +0000 |
| Subject: | Re: [Discussion] "Internal" attribute and warning | ||
| References: | 1 2 | Groups: | php.internals |
| Request: | Send a blank email to internals+get-123350@lists.php.net to get a copy of this message | ||
On Sat, May 18, 2024 at 5:18 PM Rowan Tommins [IMSoP]
<imsop.php@rwec.co.uk> wrote:
>
> On 18/05/2024 15:00, Robert Landers wrote:
>
> I've been thinking about having an "internal" attribute that will emit
> a warning if called from outside it's left-most namespace.
>
>
> I like the general idea, but I don't think limiting to "left-most namespace" is
> the best semantics.
>
> It's very common for the top-level namespace to represent a vendor, and the *second* level
> to be the specific package, e.g. Doctrine\DBAL vs Doctrine\ORM. You've even used that in your
> example - I presume you've made a typo, and meant both examples to be calling PackageA not
> PackageB. In other cases, there are more levels - e.g. Composer package
> "doctrine/mongodb-odm" has root namespace "Doctrine\ODM\MongoDB".
I thought about that too, but in-general, a vendor has the knowledge
and capability to ensure any two packages work together (like Doctrine
plugins in your example).
>
> Possibly the attribute would need some argument to specify its granularity, e.g.
> #[Internal('\MyCompany\PackageA')], #[Internal('\Doctrine\ODM\MongoDB')], but
> that would be annoying to write each time.
>
That could be a useful optional parameter, and might be worth considering.
> This is another case where PHP suffers from its lack of a separate concept of
> "package" or "module" to scope things to.
>
>
> My second concern is how to implement this efficiently. The check can't happen at
> compile-time, because we don't know the definition of SomeOtherNamespace\Foo; so the check
> would need to be at run-time when the method/function is called. But at run-time, namespaces have
> very little existence - they really are just part of the names of functions, classes, and constants.
>
> So when calling a marked function, we would have to look up the name of the calling function or
> the class name of the calling method, and then do a string comparison against the namespace
> constraint. Maybe that would be easy and fast, I don't know.
This is a concern of mine as well, but I'm mostly curious if anyone
even wants this before I worry about implementation details. Right
now, I don't see it being any slower than type-checking, though I
foresee a bit more memory usage to keep track of the caller/callee
namespace.
>
> Regards,
>
> --
> Rowan Tommins
> [IMSoP]