我在应用程序的许多类中都使用了一些实用程序函数,其中一些例子是:
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);
该解决方案的问题在于它在我的类中创建了硬连线依赖项。 (我宁愿复制每个班级的功能)。
另一个想法是将实用程序类注入到我的对象中,但是对于一些函数来说,这感觉不对,我可能不得不将它们注入到我的许多对象中。
我想知道其他人如何处理这个问题。谢谢你的任何建议!
答案 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;
}
}