【问题标题】:Helper Class in PHPPHP中的帮助类
【发布时间】:2011-10-27 06:00:30
【问题描述】:

我想创建一个辅助类,其中包含 cleanArray、split_char、split_word 等方法。

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

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

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

我所知道的是 OOP 的基本知识,在每个使用 Helper 类的 Class 中都必须创建一个 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   ٢ ٣  .,}{ + _"));
?>

【问题讨论】:

  • A、B、C、D、E 类在做什么?他们的责任是什么?
  • 我发现这个链接net.tutsplus.com/tutorials/php/… 很好的教程,只是创建一堆函数,而不是在类内部或类内部的静态方法。你怎么看?
  • 它不起作用,因为您定义了一个名为 LanguageDetection 的类并尝试实例化一个名为 Detection 的类

标签: php oop


【解决方案1】:

Helper 类通常表示对模型的问题领域缺乏了解,并被许多人视为反模式(或至少是代码异味)。将方法移动到它们所属的位置,例如在他们操作属性的对象上,而不是在静态类中收集远程相关的函数。对具有相同行为的类使用继承。当对象在行为上不同但需要共享某些功能时使用组合。或者使用特征。

您在 PHP 中经常会发现的静态 Utils 类是一种代码味道。人们会将或多或少的随机函数放入一个类中来组织它们。当您想使用 PHPgroup those into a namespace。当你想做 OOP 时,你想avoid static methods。您希望您的对象具有High Cohesion and Low Coupling。静态方法正好相反。 This will also make your code less testable.

此外,每个使用 Helper 类的 Class 都必须创建一个 helper 对象是一种代码味道。您的协作者不应创建其他协作者。将复杂对象图的创建移到工厂或构建器中。

【讨论】:

  • 你可以看到这个链接stackoverflow.com/questions/7058411/…
  • @Gordon - 听起来有点教条,至少如果普遍应用的话。如果功能没有映射到特定的问题域怎么办? java.util.Arrays 会是反模式的一个例子,实际上应该重构为避免静态方法的东西吗?或者java.lang.Math 呢?更不用说常用辅助方法的性能问题了。
  • @Saul 我并不比任何人说如果它不在属性上操作,就让它成为静态的更教条。唯一的区别是我不是说“让它静态”而是“不要把它放在那里”。
  • 他会将所有这些常见类型的函数放在哪里?只是包含在他的初始加载中?如果他有 25 个,这会减慢速度吗?我正在阅读您提供的链接,但我很困惑。你是说他应该在每个班级都放同样的功能?
  • @bob-12345 该类是大部分冗余和/或不相关的包装器和方法的大杂烩。它没有凝聚力,根本不应该是一个类。这是为什么 Helper 类被认为是代码异味的一个典型例子。例如,为什么 UUID 有专门的类?当 PHP 有本机版本时,为什么我需要通过三个调用包装器调用来重新发明 ucfirst()?为什么slug 在那里?为什么不分开大小写转换?整个事情感觉就像“哦,让我们在这里以某种方式将所有对字符串进行操作的方法抛出”但是是的……Laravel……¯\_(ツ)_/¯
【解决方案2】:

根据经验,帮助程序应包含通用但在应用程序的整体架构下没有特殊指定的功能。

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

简而言之:

// Helper sample
//
class ConversionHelper {

   static function helpThis() {
      // code
   }

   static function helpThat() {
      // code
   }
}

// Usage sample
//
class User {

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

【讨论】:

  • 谢谢,所以我必须在所有使用它的类中包含(包括“Helper.php”;)帮助类?还是我必须延长?谢谢
  • 扩展将是一个坏主意,除非您想创建一个更专业的版本。我推荐include
  • 调用一种方法时可以,但如果调用多于一种方法就不行了,请看我的更新,谢谢
  • @Ahmad - 更具体一点。预期的行为是什么?出了什么问题?它给出了哪些错误和警告?
  • 对不起,split_word 方法是我的错。非常感谢它有效:)
【解决方案3】:

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

代替:

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

应该是

namespace Helper;

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

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

【讨论】:

  • 你能举个例子吗?谢谢
【解决方案4】:

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

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

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

【讨论】:

    【解决方案5】:

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

    /* 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';
    

    【讨论】:

    • 谢谢,所以我必须在所有使用它的类中包含(包括“Helper.php”;)帮助类?还是我必须延长?谢谢
    • 调用一种方法时可以,但如果调用多于一种方法就不行了,请看我的更新,谢谢
    • 对不起,split_word 方法是我的错。非常感谢它有效:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 2014-06-15
    • 2011-01-10
    • 2010-12-30
    相关资源
    最近更新 更多