As an aside, having this kind of #ifdef type stuff also allows us to write
forward compatible scripts without worrying about invalid syntax breaking
older versions.

On Fri, Feb 5, 2016 at 11:20 AM, Pierre Joye <pierre....@gmail.com> wrote:

> On Thu, Feb 4, 2016 at 2:00 AM, Davey Shafik <da...@php.net> wrote:
> > On Wednesday, February 3, 2016, Sara Golemon <poll...@php.net> wrote:
> >
> >> > I think Dan raises some interesting points, although I think
> >> zend_version()
> >> > is often used for feature detection so they try to put a zend version
> in
> >> > there to be helpful i.e. HHVM x.y.z === PHP a.b (feature-wise).
> >> >
> >> That's exactly why PHP_VERSION is faked in HHVM.  Because that's how
> >> users use it.  Essentially, we're treating PHP_VERSION as "PHP
> >> language specification version X.Y"  So for example, hhvm 3.12.0
> >> conforms to phplang-spec 7.0.0 so it defines HHVM_VERSION to tell what
> >> it is, while PHP_VERSION exists for all those scripts that were
> >> written under the assumption that there's only one PHP runtime.
> >>
> >> I would actually suggest that if something like this RFC goes through,
> >> we formally define PHP_VERSION in exactly that way.  As a language
> >> specification conformance advertisement.  PHP_ENGINE_VERSION would be
> >> the build ID for the actual runtime implementation.  In the case of
> >> the reference implementation, these numbers would be identical, so
> >> there would be no effective change.  In the case of other
> >> implementations, they'd differ.  For example on HHVM you'd have:
> >> PHP_VERSION=7.0.0, PHP_ENGINE=hhvm, PHP_ENGINE_VERSION=3.12.0
> >>
> >> All that said, I'm not convinced we *need* explicitly enumerated
> >> constants like PHP_ENGINE, but for that 0.1% of scripts that care who
> >> they're running under, it would certainly unify that detection in a
> >> useful way.
> >>
> >> To the question of "are we just replicating browser detection and all
> >> its problems?", I'd offer that perhaps the solution lies not in more
> >> constants, but in Reflection.  For example:
> >>
> >> class ReflectionLanguage {
> >>   public function isSupported($feature): bool;
> >>   public function variableSyntaxConformance(): string;
> >>   public function strictTypehints(): bool;
> >> }
> >>
> >> Some of these would be compiler constant-ish, others might be per-file
> >> (like strictTypeHints()).
> >>
> >> ^^ The above is a half-baked idea, please alter/destroy it at will.
> >>
>
> I am also really not convinced we need a PHP_ENGINE_* set of
> constants. It defeats the purpose of these constants.
>
> Each non php.net implementation could (should?) have a
> <implementation> and <implementation>_<version> constants, for
> instance, HHVM and HHVM_VERSIONS_* constants. These constants can then
> be used to do the required work-around for bugs or to use
> implementation specific features.
>
> > Unfortunately Sara, the types of things you generally have to work around
> > are minor things, like differences in DOM, or the inability to
> json_encode
> > DateTimeImmuteable
> >
> > I do however like the idea of feature detection - I wonder if perhaps we
> > could do something where it's done at compile time and therefore
> minimally
> > impacts runtime?
>
> This could be what you actually need. A #ifdef equivalent for PHP. I
> remember a discussion about adding these features to the core to allow
> to enable/disable portions of a script at the parsing/compilation
> level. Doing so allows mixing codes being valid for various
> implementations inside a same file. It is especially important for
> features using syntax not compatible with a php.net's PHP
> specification (for instance).
>
> I am not very keen about that either as I prefer to use separate
> files. However it seems to be where we could move forward for these
> kind of needs? parser/compilation time constants or expression (like
> HAVE_FOO in C for example but only defined by the respective engine
> and maybe extensions) as well as at runtime (as normal PHP constants).
> Just a thought :)
>
> Cheers,
> --
> Pierre
>
> @pierrejoye | http://www.libgd.org
>

Reply via email to