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 -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php