PHP中的助手类

时间:2011-08-15 12:25:51

标签: php oop

我想创建一个包含cleanArray,split_char,split_word等方法的帮助器类。

它自己的助手类将与许多类一起使用。例如:

Class A will user Helper, Class B, Class C, D, E also user Helper Class

在PHP中编写和使用helper类的最佳方法是什么?

我所知道的是OOP的基本知识,在每个使用Helper类的类中都必须创建一个辅助对象。

$helper = new Helper();

正确或可能是某人可以给我最好的方法。

我还将创建可以使用A,B,C等类的XXX类

更新: - >修复了我在split_word方法中的错误:D

基于Saul,Aram Kocharyan和alex回答,我修改了我的代码,但它不起作用,我不知道为什么。

<?php
class Helper {
    static function split_word($text) {
        $array =  mb_split("\s", preg_replace( "/[^\p{L}|\p{Zs}]/u", " ", $text ));
        return $this->clean_array($array);
    }
    static function split_char($text) {
        return preg_split('/(?<!^)(?!$)/u', mb_strtolower(preg_replace( "/[^\p{L}]/u", "", $text )));
    }
}
?>

我在其他课程中使用

<?php
include "Helper.php";
class LanguageDetection {
    public function detectLanguage($text) {
        $arrayOfChar = Helper::split_char($text);
        $words = Helper::split_word($text);
        return $arrayOfChar;
    }
}
$i = new Detection();
print_r($i->detectLanguage("ab  cd    UEEef   する ح      خهعغ فق  12  34   ٢ ٣  .,}{ + _"));
?>

5 个答案:

答案 0 :(得分:34)

帮助程序类通常表示缺乏对模型问题域的了解,并被许多人视为AntiPattern(或至少是代码嗅觉)。移动它们所属的方法,例如在他们操作的属性的对象上,而不是在静态类中收集远程相关的函数。对具有相同行为的类使用继承。当对象在行为上不同但需要共享某些功能时使用Composition。或者使用Traits。

您经常在PHP中找到的静态Utils类是代码气味。人们会将或多或少的随机函数抛入一个类来组织它们。当你想用PHP&lt; 5.2进行程序编码时,这很好。从5.3开始,你会group those into a namespace而不是avoid static methods。如果你想做OOP,你想要High Cohesion and Low Coupling。您希望对象具有This will also make your code less testable。静态方法完全相反。 Are Helper Classes Evil?

此外,每个使用Helper类的类必须创建一个帮助对象才是代码气味。您的协作者不应该创建其他协作者。将复杂对象图的创建转移到工厂或构建器中。

答案 1 :(得分:12)

根据经验,助手应该包含常见的功能,但在应用程序的整体架构下没有特别指定。

  • 使用Helper
  • 后缀类名
  • 尽可能使用静态方法

简而言之:

// Helper sample
//
class ConversionHelper {

   static function helpThis() {
      // code
   }

   static function helpThat() {
      // code
   }
}

// Usage sample
//
class User {

   function createThings() {
      $received = ConversionHelper::helpThis();
   }
}

答案 2 :(得分:3)

您应该只编写简单的函数,而不是创建静态类,并将该文件包含在index / bootstrap文件中(您甚至可以使用命名空间)。

而不是:

class Helper {
    static function split_word($text) { ...
    static function split_char($text) { ...
}

namespace Helper;

function split_word($text) { ...
function split_char($text) { ...

没有必要将它全部包装在一个类中。仅仅因为你把它放在一个类中并没有使它面向对象..实际上它确实是完全相反的。

答案 3 :(得分:2)

您可以使用静态方法创建一个类......

class Str {
   public static function split_char($str, $chr) {
      ...
   }
}

你也可以使用namespace命名一堆函数,但我认为前者是首选。

答案 4 :(得分:1)

在类中使用公共静态方法:

/* Common utility functions mainly for formatting, parsing etc. */
class CrayonUtil {
    /*  Creates an array of integers based on a given range string of format "int - int"
     Eg. range_str('2 - 5'); */
    public static function range_str($str) {
        preg_match('#(\d+)\s*-\s*(\d+)#', $str, $matches);
        if (count($matches) == 3) {
            return range($matches[1], $matches[2]);
        }
        return FALSE;
    }
    // More here ...
}

然后像这样调用它们:

CrayonUtil::range_str('5-6');

如果在另一个文件中,请使用顶部的以下内容:

require_once 'the_util_file.php';