2013-06-24 4 views
3

Так что моя цель прямо сейчас, чтобы обнаружить пользователя PHP версии (не проблема), а затем запустить, если еще на его основеВыполнить Условный Использование PHP Version

Так что, если я пишу что-то вроде этого:

if (PHP => 5.3){ 
// call a function anonymously 
} 
else { 
// if user does not have 5.3, this else block disables the feature. 
} 

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу использовать анонимные функции PHP, если у пользователя есть 5.3 или более поздние версии (поскольку они были введены в PHP 5.3) и альтернатива, если у них более старая версия. Проблема, конечно, в том, что если пользователь имеет PHP 5.2.17, например, что, если этот оператор if никогда не будет оцениваться как истинный, для синтаксиса будет вызываться фатальная ошибка, поскольку анонимный вызов функции выглядит как синтаксическая ошибка PHP 5.2.17

Есть ли способ сделать что-то вроде выше? Единственная работа вокруг я нашел, чтобы положить вещи в случае в новый файл, и материал в другой в другом, и сделать что-то вроде этого:

$version = '5.2';//user's current version cut to the nearest x.y, ex 5.3, 5.4, 5.5 
// Remove the period here, so we have 5.2 
require 'function'.$version.'.php'; 

Теперь это будет работать нормально, так как function53.php никогда не будет загружен для пользователя 5.2. Однако не обязательно использовать отдельные файлы.

После прочтения комментарий, чтобы quesiton Алеся в, что-то вроде этого:

if ($version > '5.3'){ 
// require one file 
} 
else{ 
// require another 
} 

не будет работать. Компилятор PHP будет запускать оба файла при проверке компиляции для синтаксических ошибок перед выполнением и выдавать ошибку, которую я пытаюсь избежать. Единственный способ работы с файловым методом - динамически выбирать файл на основе номера версии. Для этого требуется отдельный файл для каждого выпуска x.y с PHP 4 и 5. Не идеально.

По ответам Алекса, он отлично работает. Мы говорим об одной строке eval (требуется, чтобы скрыть анонимный вызов функции), по сравнению с предлагаемыми тоннами файлов.

+2

[version_compare()] (http://php.net/manual/en/ function.version-compare.php)? –

+2

Way, * способ * особо работа. Вы серьезно собираетесь написать * две копии * всего вашего кода, просто чтобы воспользоваться новым синтаксисом, когда старый синтаксис * отлично работает * в обеих версиях? – meagar

+0

Вы действительно хотите дублировать код для этого? У вас должна быть * одна реализация этой функции в синтаксисе, который может обрабатывать самая младшая версия PHP, которую вы хотите поддерживать. Он будет работать так же, вы не должны переписывать его как закрытие * также * просто потому, что можете. – deceze

ответ

2

Вы можете просто оценить код, который компилируется на лету.

$res = -1 
if (PHP => 5.3){ 
    eval('$res = [some advanced PHP 5.3 fast code]'); 
} 
else { 
    $res = [some basic PHP 4 code still supported by 5.3, just deprecated]; 
    eval('$res = [some real rudimentary PHP 4 code no longer supported at all in 5.3]'); 
} 
$res = $res + 1; 
echo $res; 

if (PHP => 5.3){ 
    eval('$res = [some more advanced PHP 5.3 fast code]'); 
} 
else { 
    $res = [some more basic PHP 4 code still supported by 5.3, just deprecated]; 
    eval('$res = [some more real rudimentary PHP 4 code no longer supported at all in 5.3]'); 
} 

Посмотрите, как было бы больно включать 50 разных файлов таким образом, но eval облегчит его? Есть регионы в его файле с большим перекрытием, поэтому он не хочет просто создавать два отдельных файла, поэтому вместо этого он хочет, чтобы несколько раз подряд исполнялись два отдельных раздела кода в середине его файла.

+1

@OneTrickPony «Итак, моя цель прямо сейчас заключается в обнаружении PHP-версии (не проблема)», «фатальная ошибка будет выбрана для синтаксиса, поскольку анонимный вызов функции выглядит как синтаксическая ошибка для PHP 5.2.17». а не с обнаружением версии, но с получением синтаксических ошибок для нового блока кода, который не работает со старым PHP. Решение - это eval, который будет давать синтаксические ошибки только после его запуска (и он не будет работать для старых версий). Пожалуйста, прочитайте вопрос перед случайным downvoting ... –

+2

@OneTrickPony Нет, пожалуйста, прочитайте то, что я написал, я специально сказал «однако это не идеальный вариант, чтобы использовать отдельные файлы». Решение Alex похоже, что я ищу. Тестирование прямо сейчас. – Chris

+0

@Chris Я бы действительно держался подальше от написания любого количества кода в виде строки в 'eval', вместо этого используйте отдельный файл! – deceze

3
$version = explode('.', PHP_VERSION); 
if ($version[0] > 5 || ($version[0] == 5 && $version[1] >= 3)) { 
    //include with anonymous functions 
    include 'file1.php'; 
} else { 
    //include alternatives 
    include 'file2.php'; 
} 

К сожалению, код я ставлю ниже ошибся -.-

Поскольку вы не можете добавить php5-код ​​непосредственно в коде, и вы не хотите идти включить файл существует способ использовать create_function(), где вы помещаете свой код в строку, что тоже не очень красиво, но может выполнить эту работу за вас.

+0

Этот метод уже был предложен в комментариях ... Кроме того, ему не нравится, потому что он загромождает файловую систему –

+2

@Alex Ну, это лучше, чем использование eval + во всем мире. –

+1

, и это нормальное решение для использования файлов mulitple для нескольких версий, если у вас нет условий предварительной компиляции, таких как c, и не нужно сравнивать при каждом вызове, что делать. – luk2302

2

Для каждой функции определите одну функцию или класс. Если вам нужны различия в версии для них, создайте один файл для каждой версии. Например .:

features_5.3.php

function foo() { ... } 

function bar() { ... } 

features_5.2.PHP

function foo() { ... } 

function bar() { ... } 

Затем проверьте еще какую версию вы работаете на и включить соответствующий файл:

if (version_compare(PHP_VERSION, '5.3.0', '>=')) { 
    require_once 'features_5.3.php'; 
} else { 
    require_once 'features_5.2.php'; 
} 

Затем с помощью функции, где это необходимо:

foo(); 

Для PHP версии, которые не поддерживайте эти функции, просто сделайте foo() a no-op; или, возможно, проверить, если данная функция поддерживается, когда вам нужно вызвать его:

if (function_exists('foo')) 

или установить константы:

if (FEATURE_FOO_AVAILABLE) { 
    foo(); 
} 
+0

Это разумное решение, я дам это, но оно также делает это боль; изменение переменных из функции требует от вас их глобальных и других, что просто делает все бесполезным. Но все-таки для этого, умная идея, +1 –

+0

Я действительно не могу сказать, это тролль или нет. Если вы попытаетесь запустить это, как объясняется в вопросе, оба файла будут запускаться PHP. Поэтому вы получите ошибки. – Chris

+2

@ Chris ** Они не будут !! ** Условные включения условны! – deceze