1

本机 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 本机库。我刚刚更改了类名 rest is same 的情况,使其在 CI 中工作。我在另一个库中使用它,所以使用 CI 实例。

4

1 回答 1

1

CodeIgniter 的模式是单例。phpUri 使用静态调用。我建议您熟悉它们之间的巨大差异。

这里的重点是phpUri使用从类请求的静态调用parse,而不是对象本身,因为 CodeIgniter 是一个单例,它是一个带有子对象的对象(为了简单起见,请阅读更多信息)。话虽如此,这不起作用的原因是它phpUri的行为不像一个对象,并且只在静态调用之后产生(返回)对象:

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

可以简化为:

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

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

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

But it is much easier to write an abstraction layer library in CodeIgniter that uses static calls in it's object's non-static methods:

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

Then in your library

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

That is what an abstract class is - the one that gives you an interface.

于 2013-02-05T09:36:28.700 回答