从PHP 7.4升级到8.0后Joomla网站上出现错误

ncgqoxb0  于 2023-01-24  发布在  PHP
关注(0)|答案(1)|浏览(315)

更新2:
关于错误"调用成员函数children()on null",我找到了这些函数。

public function hasChildren()
{
    return $this->hasChildNodes();
}

public function children($query = null)
{
    $children = array();

    if (!$this->hasChildren()) {
        return $children;
    }

    if ($query == null) {

        foreach ($this->childNodes as $child) {
            if ($child->nodeType == XML_ELEMENT_NODE) {
                $children[] = $child;
            }
        }

        return $children;
    }

    return $this->query(CssSelector::toXPath($query, 'child::'));
}

public function removeChildren()
{
    while ($child = $this->firstChild) {
        $this->removeChild($child);
    }

    return $this;
}

#########################################

更新:
我想把密码改成

public function before(...$data): void
    {
      foreach($data as $item) {

        $item = $this->prepareInsert($item);
        $this->parentNode->insertBefore($item, $this);

     }
 }

这看起来很有效,但是我得到了更多这样的错误。有一次我把代码从:

public function prepend($data)
{
    $data = $this->prepareInsert($data);

    if (isset($data)) {
        if ($this->hasChildren()) {
            $this->insertBefore($data, $this->firstChild);
        } else {
            $this->appendChild($data);
        }
    }

    return $this;
}

改为:

public function prepend(...$data): void 
{
    foreach($data as $item)
    {
        $item = $this->prepareInsert($item);

        if (isset($item)) {
            if ($this->hasChildren()) {
                $this->insertBefore($item, $this->firstChild);
            } else {
                $this->appendChild($item);
            }
        }
    }
}

现在,我的页面上显示错误消息:

Call to a member function children() on null

没有其他信息。
我们已经安装了Joomla 3.10.10,并使用BDThemes的模板"Effortless"(我们很久以前通过Envato购买的)。2该模板基于Warp 7框架。3然而,我们的版本已经过时,不能再更新,因为模板在Envato上不再可用。4目前我们仍然使用PHP 7.4,当我们升级到PHP 8.0时,我们得到错误消息:
"致命错误:Warp\Dom\Element::之前的声明($data):void必须与DOMElement::before(... $节点)兼容:在/homepages/13/d238860405/htdocs/homecms_ta/templates/毫不费力的/warp/源代码/warp/Dom/Element.php中的第108行无效"
代码:

public function before($data)
    {
        $data = $this->prepareInsert($data);
        $this->parentNode->insertBefore($data, $this);

        return $this;
    }

不幸的是,我不知道怎么修。如果能帮上忙,我将不胜感激。

njthzxwz

njthzxwz1#

Element有一些更新的方法(在IE时代不可用),例如:

  1. https://developer.mozilla.org/en-US/docs/Web/API/Element/after
  2. https://developer.mozilla.org/en-US/docs/Web/API/Element/before
  3. https://developer.mozilla.org/en-US/docs/Web/API/Element/prepend
  4. https://developer.mozilla.org/en-US/docs/Web/API/Element/append
    很明显,DOMElement PHP的新版本也试图遵循它,所有这些都是可变的,但是主题的旧代码可能假设您只有一个元素要插入。
    最简单的解决办法(最小的变化)可能是使用变量参数...$your_variable_name as $data,然后在数据周围使用foreach($your_variable_name as $data){...}。(如果有人曾经使用$element -> before($oneThing) -> before($anotherThing),则第二个将失败(因为第一个before的返回类型是void,不像$this的旧返回值,您可以在此之后直接使用->before)。
    return $this可能不会被使用(尽管我不确定)。
    例如:
    • 之前**
public function before(...$nodes): void
{
    foreach($nodes as $data){
        $data = $this->prepareInsert($data);
        $this->parentNode->insertBefore($data, $this);
    }
   // return $this; 
}
    • 预先挂起**
public function prepend(...$nodes): void 
{ 

    foreach($nodes as $data){
        $data = $this->prepareInsert($data); 
        if (isset($data)) { 
            if ($this->hasChildren()) { 
            $this->insertBefore($data, $this->firstChild); 
            } else { 
                $this->appendChild($data); 
            } 
        }
   }
   // return $this; 
}

(note我不能自己测试,因为我没有你使用的模板的完整代码)

相关问题