PHP 动态面包屑脚本在切换到 PHP 8.0 后创建了错误的 URL

PHP dynamic breadcrumb script creates wrong URL after switching to PHP 8.0

我正在使用 PHP 脚本创建动态面包屑导航。几年前我在另一个论坛上发现了它,它最初发布于 2006 年。我通过删除一些已弃用的功能对其进行了更新,到目前为止它运行良好。它从页面 URL:

创建面包屑
$path = $this->_homepath;
$html ='';
$html .= '<a href="https://www.myhomepage.com">Start</a>';

$parts = explode('/', $_SERVER['PHP_SELF']);
$partscount = count($parts);
for($i = 1; $i < ($partscount - 1); $i++) { 
  $path .= $parts[$i] . '/';
  $title = $parts[$i];
  
  if ($this->_usereplacements == true) { 
    reset($this->_replacements);
    foreach($this->_replacements as $search => $replace) {
        $title = str_replace($search, $replace, $title);
    }
  }
  
  if ($this->_replaceunderlines == true) { 
    $title = str_replace('_', ' ', $title);
  }
  
  if ($this->_ucfirst == true) { 
    $title = ucfirst($title);
  }
  
  if ($this->_ucwords == true) { 
    $title = ucwords($title);
  }
  
  $html .= $this->_separator . '<a href="' . $path . '">' . $title . '</a>';
}

当前页面标题,即bradcrumb的最后一个元素,生成如下:

$title = '';
if ($title == '') { 
  $title = $parts[$partscount-1];
  
  if ($this->_usereplacements == true) { 
   reset($this->_replacements);
   foreach($this->_replacements as $search => $replace) {
        $title = str_replace($search, $replace, $title);
   }
  }
 
  if ($this->_removeextension == true) { 
    $title = substr($title, 0, strrpos($title, '.'));
  }
  
  if ($this->_replaceunderlines == true) { 
    $title = str_replace('_', ' ', $title);
  }
  
  if ($this->_ucfirst == true) { 
    $title = ucfirst($title);
  }
  
  if ($this->_ucwords == true) { 
    $title = ucwords($title);
  }
}
$html .= $this->_separator . '<b>' . $title . '</b>';

我只复制了脚本的相关部分并保留了例如。函数声明。

从 PHP 7.4 切换到 8.0 后,我发现脚本有点乱。考虑一个包含 url 的页面:https://www.myhomepage.com/site1/site2/site3

对于 site1 的碎片,脚本现在生成 URL https://www.myhomepage.com/site1/site2/site1 代替 https://www.myhomepage.com/site1/,而对于 site2 它显示 https://www.myhomepage.com/site1/site2/site1/site2 而不是 https://www.myhomepage.com/site1/site2/。如您所见,整个路径 https://www.myhomepage.com/site1/site2/ 始终作为前缀添加到面包屑的实际路径之前。

这东西看了两天还没找到解决办法。我想 PHP 8.0 中有一些变化导致了这种行为,但我没有在不兼容列表 (https://www.php.net/manual/de/migration80.php) 中找到任何线索。我打印了 §path$title,它们看起来应该是这样。在 for 循环中的每次迭代后回显 $html 时,它已经显示了错误的 URL。这就是为什么我认为 for 循环可能是这里的问题所在。你有什么建议吗?

如有任何帮助,我们将不胜感激。

我终于弄清楚是什么导致了脚本的奇怪行为。在面包屑构造函数的声明中有$this->_homepath = '/';。稍后我分配 $path = $this->_homepath;。当我回显 $path 时它是空的而不是显示前面提到的“/”。所以我直接设置 $path = '/'; 现在一切都正常了。