AW: interface method visibility.

php.internals

Matthias Pigulla

20 years ago
Jochem, the point with most of these issues is that there's no common understanding of what things like protected or static interface members mean; from an OO point of view, they make no sense, and I was only trying to explain why. Unless there is a common understanding what a certain language construct means, every way of implementing it is pretty arbitrary. So not implementing it at all is not "self-imposed purism".
> should be - it worked in the 5.0RC1, I understood what I was > doing and I was happy doing it.
If these things were legal with 5.0.0 (were they really? I dunno...), one could argue wheter it's good practise to 'suddenly' make them E_FATAL in a minor release. However, even if they ever worked, at best it was undocumented (=random) behaviour.
> right which meant in one particular case I had to create an > object especially to call the given method, very wasteful, > pointless and the only good reason there seems to be is some > academic crud which you have reiterated here.
I don't get that should have worked otherwise, but if you want to let's discuss this one off-list.
> > In "older" code you could not > > mark methods as static, so the language could not check if a static > > call is allowed. It simply permitted the call, not setting $this. > > everything I mention here is related only to my experience > with php5 and up since Nov'03.
If a method does not access "$this", it can be used statically. So best would be to have the "static" modifier in place to make things clear, but that would require _you_ to add it to your pre-php5 'legacy' code. So, although "academically" not correct, the engine still permits it - simply because it did so in the past in an agreed-on manner. With E_STRICT it will addidionally tell you that as of PHP5 you have a keyword to get it "right".
> >>also I noticed that using the keyword 'abstract' with a > >>interface method declaration is all of a sudden (5.1RC5dev) > >>causing a fatal error where before (5.0.2 - 5.0.4) no error > >>what so ever. > > > > I thought I would never write anything like that - but: What sense > > does "abstract" make in an interface at all? > > the point is it doesn't hurt _you_ to let _me_ do it. if it > makes sense to me but nobody else thats no reason not to > allow it on grounds of principle when it is clear that it has > worked without problem.
"Worked without problem" is not necessarily a good argument for such things. However, I just found that "abstract" was also once legal in Java (http://java.sun.com/docs/books/tutorial/java/interpack/interfaceDef.htm l, note at the bottom). They removed it because it makes no sense (interfaces are abstract by nature). Now I know that this is by no means a better argument ;), but maybe a notice instead of fatal would be enough?
> > As I understand it, E_STRICT is for complaining about stuff > > like "var" > > that was ok with PHP4 but is discouraged in PHP5. But you are using > > PHP5 elements in a way that make no sense to the language, so it's > > simply an error. > > and as I understand it E_STRICT is for pedantic checking - > i.e. check if every t is crossed and every i dotted (so to > speak) nothing perse to do with php4 (or will E_STRICT be > dropped when support for php4 code is dropped from the engine?)
I am not really familiar with engine internals, so maybe someone more enlighted than me could comment on this one and decide if E_NOTICE or E_STRICT is more appropriate.
> if its not possible then I what flippin' universe have I been > coding in for the past 2 years??? the only thing making it > 'not possible' is self-imposed purism.
As you can see I changed my opinion as to "abstract". But as to non-public and static members - you're asking for the engine to simply ignore modifiers you explicitly give and that make no sense. Programming languages don't work that way. -- mp.