Предупреждение PHP: extract() ожидает, что параметр 1 будет массивом

#php

Вопрос:

В журнале ошибок я получил эту ошибку PHP Warning: extract() expects parameter 1 to be array , это приведет к перегрузке сервера и увеличению загрузки процессора. что не так в моей функции php.

 <?php
function rel2abs($rel, $base) {
  if (empty($rel)) $rel = ".";
  if (parse_url($rel, PHP_URL_SCHEME) != "" || strpos($rel, "//") === 0) return $rel; 
  if ($rel[0] == "#" || $rel[0] == "?") return $base.$rel; 
  extract(parse_url($base)); 
  $path = isset($path) ? preg_replace('#/[^/]*$#', "", $path) : "/"; 
  if ($rel[0] == '/') $path = ""; 
  $port = isset($port) amp;amp; $port != 80 ? ":" . $port : "";
  $auth = "";
  if (isset($user)) {
    $auth = $user;
    if (isset($pass)) {
      $auth .= ":" . $pass;
    }
    $auth .= "@";
  }
  $abs = "$auth$host$path$port/$rel"; //Dirty absolute URL
  for ($n = 1; $n > 0; $abs = preg_replace(array("#(/.?/)#", "#/(?!..)[^/] /../#"), "/", $abs, -1, $n)) {} 
  return $scheme . "://" . $abs;
}
 

Комментарии:

1. Как видно из документации , для серьезно искаженных URL- parse_url() адресов может возвращаться значение false.

2. можете ли вы исправить функцию выше.

Ответ №1:

Как упоминалось в комментарии выше parse_url() , функция вернет false, если она не сможет проанализировать URL-адрес. И extract() в качестве первого параметра требуется массив (не логическое значение).

Так что вместо:

 extract(parse_url($base));
 

Тебе нужно что-то вроде этого:

 $parsedUrl = parse_url($base);
if ($parsedUrl === false) {
    throw new RuntimeException(sprintf('Unable to parse url [%s]', $base));
}

extract($parsedUrl);