Почему сервер возвращает пустую страницу с заголовком 500, если по идее должен вернуть ошибку парсинга с указанием номера строки? Допустим вот скрипт, где есть ошибка : PHP: <?php error_reporting(E_ALL); ini_set('display_startup_errors', 'E_ALL'); ini_set('display_errors', 'E_ALL'); asdgasgdasgdga;// Сама ошибка ?> .htaccess у меня пустой Вот что говорит php_info() : http://rust.hostenko.com/phpinfo().html
E_ALL это константа, у неё есть значение, но ты похоже просто передал текст E_ALL, понимаешь например разницу между echo "$test"; и echo '$test'; и echo $test; ? Вот зарезервированные константы https://secure.php.net/manual/ru/reserved.constants.php Константы https://secure.php.net/manual/ru/language.constants.php Теперь по настройкам во время выполнения: https://secure.php.net/manual/ru/errorfunc.configuration.php display_startup_errors и display_errors принимают 0 или 1, а не E_ALL текст или 332767 которое возвращает константа E_ALL. Запусти и посмотри где там 0 или 1, нету PHP: var_export(E_ALL);
Да. Получилось. Спасибо. Но еще вдогонку маленький вопрос : Почему при вызове функции, где есть ошибка в параметрах, сервер не возвращает никакой ошибки? Вот пример : PHP: <?php error_reporting(E_ALL); ini_set('display_startup_errors', E_ALL); ini_set('display_errors', E_ALL); function abc($a = 1, $b = 2, $c = 3 ) { echo <<<HERE <pre> a=$a; b=$b; c=$c; HERE; } abc(5,6,);//ошибка. забыл вставить число ?> И в ответ никакой ошибки. Хотя sandbox сервис возвращает ошибку : HTML: <br /> <b>Parse error</b>: syntax error, unexpected ')' in <b>[...][...]</b> on line <b>15</b><br />
Значения аргументов по умолчанию https://secure.php.net/manual/ru/functions.arguments.php#functions.arguments.default У тебя установлено значение 3 для $c по умолчанию, значит его можно не упоминать. Если бы там не было значения по умолчанию, то и ошибка появилась бы.
Убрал значения по умолчанию из функции PHP: abc($a, $b, $c ) . Результат такой же - ошибка не выводится, пустой экран. Ну да ладно. Фиг с этой скрытной ошибкой. Мне вот интересно как вызвать функцию abc($a=1, $b=2, $c=3 ); при этом указать только третий параметр, а первые два чтобы остались значения по умолчанию? PHP: <?php function abc($a = 1, $b = 2, $c = 3 ) { echo <<<HERE <pre> a=$a; b=$b; c=$c; HERE; } abc(7);/*7 хочу поместить в $c. $a и $b должны быть по умолчанию*/ ?>
может я что-то путаю, если ошибка 500, это проблемы в настройках апача (у апача ошибка), а не скрипта php.
Ни виртуальный мой сервер, ни хостинг не выводят в таком случае ошибок ¯\_(ツ)_/¯ Но это ладно. Научите вызывать функцию указывая только третий параметр, а первые два, не трогать. Так вообще можно?
делай один аргумент, будешь туда отправлять массив, один массив по умолчанию соединяй с тем что пришёл и чтобы тот что пришёл переписывал тот что по умолчанию. В массиве порядок ключей не имеет значения.
Изучал тут функции, и там было : "Вы можете не указывать параметры и это не вызовет ошибок, если у параметров есть значения по умолчанию". И мне стало интересно, а что если мне нужно изменить любой параметр, как тогда, ведь в том материале про функции этот вопрос не рассматривался. Значит в PHP нельзя указать abc(,,7); или что-то в этом роде. PHP: <?php function abc($a = 1, $b = 2, $c = 3 ) { echo "a=$a;"; echo "b=$b;"; echo "c=$c;"; } abc(5);//a=5;b=2;c=3; abc(5,6);//a=5;b=6;c=3; abc(5,6,7);//a=5;b=6;c=7; abc(,,7);//Хочу изменить только $c, $a и $b значения оставить по умолчанию. Но, увы, ошибка ?> Ну, нельзя значит. Ясненько. Спасибо, что помогли разобраться --- Добавлено --- Это способ вывода echo с помощью синтаксиса "here document". Удобная штука
PHP: abc(,,7);//Хочу изменить только $c, $a и $b значения оставить по умолчанию. Но, увы, ошибка нет, такое нельзя. а что есть какие то известные ЯП где можно?
Не уверен. Может и нельзя. Я следовал логике, что если можно указать для первого параметра, то можно и для последнего
Воу воу, полегче. Можно так делать! а вот так сто пудов нельзя. Зато можно так abc(7) и не важно, что там дальше еще аргументы, если у них предопределены значения. Нужно помнить так же, что парсер работает до выполнения скрипта, т.к. PHP является прекомпилируемым языком. Это означает что парсер работает до выполнения скрипта. После парсинга скрипт компилируется в бинарый код и после этого выполняется. Следовательно, инструкции не могут оказать на него влияния. Ошибки парсера будут валиться в браузер, если PHP подключен по SAPI/ISAPI и всегда пишутся в логи, если они включены.
PHP: function myStrpos($a, $b, $c) { return strpos($a, $b, $c); } echo myStrpos('example', 'm'); // Warning: Missing argument 3 for myStrpos(), Notice: Undefined variable: c, 3 function myStrpos2($a, $b, $c = 0) { return strpos($a, $b, $c); } echo myStrpos2('example', 'm'); // 3
@[vs] может мы друг друга не поняли, я речь вел что нельзя писать сначала не обязательные параметры, а потом обязательные, т.е. ($a = 10, $b) а то, что можно не обязательные параметры, это я в курсе
@VLK ну а я тебя не понял, потому что формально так писать можно - язык не запрещает. Просто смысла в этом нет. Хотя, если очень заморочиться, то можно использовать с помощью Reflection (метод __named() взят из комментариев к мануалу https://php.ru/manual/reflectionmethod.invokeargs.html) PHP: $object = new BlackMagic; $object->__named('fn', array('arg2' => 'VLK')); $object->__named('fn', array('arg1' => 'Bye', 'arg2' => 'VLK')); class BlackMagic { public function fn($arg1 = "Hello", $arg2) { echo "$arg1, $arg2 "; } /** * Pass method arguments by name * * @param string $method * @param array $args * @return mixed */ public function __named($method, array $args = array()) { $reflection = new ReflectionMethod($this, $method); $pass = array(); foreach($reflection->getParameters() as $param) { /* @var $param ReflectionParameter */ if(isset($args[$param->getName()])) { $pass[] = $args[$param->getName()]; } else { $pass[] = $param->getDefaultValue(); } } return $reflection->invokeArgs($this, $pass); } }
Я разобрался. У меня в настройках апача AllowOverride None стояло : Код (Text): <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride None Require all granted </Directory> После изменения на Код (Text): <Directory /var/www/> Options Indexes FollowSymLinks AllowOverride All Require all granted </Directory> появилось сообщение об ошибке прямо в браузере, как я и хотел :