0

我正在阅读 opencart php 源代码,但我无法弄清楚。请查看“$url = $rewrite->rewrite($url);”处的函数 rewrite()

<?php
class Url {
    private $url;
    private $rewrite = array();

    public function link($route, $args = '', $connection = 'NONSSL') {
    ....

        foreach ($this->rewrite as $rewrite) {
            $url = $rewrite->rewrite($url);
        }
        return $url;
    }

public function addRewrite($rewrite) {
    $this->rewrite[] = $rewrite;
}
}
?>

为什么上面的代码不会产生错误?
重写函数没有在类 Url 中定义,并且类 Url 没有扩展任何人??但后来我更深入地跟踪,似乎函数重写是在 seo_url 类。

class ControllerCommonSeoUrl extends Controller {
    // Add rewrite to url class
    if ($this->config->get('config_seo_url')) {
        $this->url->addRewrite($this);
    }
    ...
    public function rewrite($link) {
        if ($this->config->get('config_seo_url')) {
            $url_data = parse_url(str_replace('&amp;', '&', $link));
             ....

为什么 ?我还没有看到“Url”和这个“ControllerCommonSeoUrl”之间有任何联系。我在这里错过了一些概念吗?我应该怎么做才能理解这些代码?这里需要一点指导。

4

3 回答 3

2
foreach ($this->rewrite as $rewrite) {

迭代中的任何值:

private $rewrite = array();

也许该Url->rewrite数组包含一个实例ControllerCommonSeoUrl,这可以解释为什么$rewrite->rewrite()调用ControllerCommonSeoUrl->rewrite().

此外,您可以尝试学习使用调试器来帮自己一个忙:)

于 2012-11-22T11:17:01.953 回答
0

该类Url是一个通用类,可以调用多个 URL 重写方法,使人们可以更改 URL 重写代码。触发 SEO URL 代码以将其添加到Url类中通过以index.php​​下方式在文件中完成

// SEO URL's
$controller->addPreAction(new Action('common/seo_url'));

执行该操作时,ControllerCommonSeoUrl执行该index()方法,并且与您提供的代码一样,它会检查 SEO URL 是否在设置中处于活动状态。如果是,则将当前类添加到类中的重写数组中Url。然后,每当有人调用$this->url->link()每个重写类时,都会调用他们的rewrite()方法,并将随后的 URL 传回

于 2012-11-22T12:02:38.957 回答
0

检查控制器是否在脚本中加载任何模型,如果是,模型方法可以在脚本内简单地访问,这可能是您的脚本 $this->rewrite 的情况。

于 2012-11-22T11:26:51.420 回答