将phpUri调用转换为CI库调用

时间:2013-02-05 09:25:44

标签: php codeigniter hyperlink singleton-methods

本机PHP代码:

$href = phpUri::parse($target_url)->join($href);

我在CI中尝试过的代码无效:

$CI->load->library('Phpuri', array($target_url));
$href = $CI->phpuri->parse($target_url);
$href = $CI->phpuri->join($href);

您可以看到phpUri本地库here。我刚刚更改了类名休息的情况是相同的,以使其在CI中工作。我在另一个库中使用它,所以使用CI实例。

1 个答案:

答案 0 :(得分:1)

CodeIgniter的模式是单身。 phpUri使用静态调用。我建议你们熟悉它们之间有很大的不同。

这里的要点是phpUri使用从类中请求的静态调用parse,而不是对象本身,而CodeIgniter是一个单例,它是一个带有子对象的对象(表示为简单起见,请阅读更多相关内容)。说到这一点,之所以不起作用的原因是phpUri不像对象那样表现,只在静态调用之后产生(返回)对象:

$href = phpUri::parse($target_url)->join($href);

可以简化为:

$parsed = phpUri::parse($target_url);
$href = $parsed->join($href);

第一行是静态调用,它将一个对象返回到$parsed变量,然后你可以使用它。

在单例中,您不能通过将类定义为对象属性来创建“类父类”。这就是使用这个库的原因,你应该先重写所有的静态调用。

但是在CodeIgniter中编写一个抽象层库要容易得多,它在对象的非静态方法中使用静态调用:

class MyPhpUri {
    function parse($target_url) {
        return phpUri::parse($target_url);        
    }
}

然后在你的图书馆

$CI =& get_instance();
$CI->load->library('MyPhpUri');
$href = $CI->myphpuri->parse($target_url)->join($var);

这就是抽象类 - 给你一个接口的那个。