在应用程序范围内共享实用程序

时间:2013-11-25 02:48:25

标签: php dependencies

我在应用程序的许多类中都使用了一些实用程序函数,其中一些例子是:

private function _trailingSlashIt($s) { return strlen($s) <= 0 ? '/' : ( substr($s, -1) !== '/' ? $s . '/' : $s ); }
private function _endsWith($haystack, $needle)  { return $needle === "" || substr($haystack, -strlen($needle)) === $needle; }
private function _startsWith($haystack, $needle) { return $needle === "" || strpos($haystack, $needle) === 0; }

目前 - 直到我找到更好的解决方案 - 我在每个使用它们的课程中复制我需要的功能。

在第一次尝试避免重复代码时,我有一个实用程序(静态)类,我会做类似的事情:

$path = StringUtils::trailingSlashIt($path);

该解决方案的问题在于它在我的类中创建了硬连线依赖项。 (我宁愿复制每个班级的功能)。

另一个想法是将实用程序类注入到我的对象中,但是对于一些函数来说,这感觉不对,我可能不得不将它们注入到我的许多对象中。

我想知道其他人如何处理这个问题。谢谢你的任何建议!

1 个答案:

答案 0 :(得分:1)

如果你有PHP 5.4或更高版本,我会使用traits

有点类似于使用静态类,但是您要调用$this->theUtility() vs StringUtils::theUtility()

<?php
trait StringUtilTrait
{
    private function trailingSlashIt($s)
    {
        return strlen($s) <= 0 ? '/' : ( substr($s, -1) !== '/' ? $s . '/' : $s ); 
    }

    // other stuff
}

class SomeClass
{
    use StringUtilTrait;

    public function someMethod()
    {
        // $this->trailingSlashIt(...);
    }
}

或者,您可以使用注入但提供默认实例:

<?php
class StringUtil
{
    // ...
}

class SomeClass
{
    private $stringutil = null;

    public function setStringUtil(StringUtil $util)
    {
        $this->stringutil = $util;
    }

    public function getStringUtil()
    {
        if (null === $this->stringutil) {
             $this->stringutil = new StringUtil();
        }

        return $this->stringutil;
    }
}