PHP中的助手类

Ahm*_*mad 17 php oop

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

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

Class A will user Helper, Class B, Class C, D, E also user Helper Class
Run Code Online (Sandbox Code Playgroud)

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

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

$helper = new Helper();
Run Code Online (Sandbox Code Playgroud)

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

我还将创建可以使用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 )));
    }
}
?>
Run Code Online (Sandbox Code Playgroud)

我在其他班级使用

<?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   ? ?  .,}{ + _"));
?>
Run Code Online (Sandbox Code Playgroud)

Gor*_*don 36

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

您经常在PHP中找到的静态Utils类是代码气味.人们会将或多或少的随机函数抛入一个类来组织它们.当您想要使用PHP <5.2进行过程编码时,这很好.从5.3开始,您可以将它们分组到命名空间中.如果要执行OOP,则需要避免使用静态方法.您希望对象具有高内聚力和低耦合度.静态方法完全相反.这也将使您的代码不易测试.

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

  • @Gordon - 听起来有点教条,至少如果普遍应用的话.如果功能未映射到特定问题域,该怎么办?将[java.util.Arrays](http://download.oracle.com/javase/6/docs/api/java/util/Arrays.html)作为反模式的示例,并且实际上应该重构为避免静态方法的东西?或者[java.lang.Math](http://download.oracle.com/javase/6/docs/api/java/lang/Math.html)怎么样?更不用说使用常用辅助方法的性能问题. (4认同)
  • @ bob-12345该类是大多数冗余和/或无关的包装器和方法的大杂烩.它没有凝聚力,根本不应该是一个阶级.这是为什么Helper类被认为是代码气味的一个主要例子.例如,为什么UUID的东西在那里有专门的类?当PHP具有本机版本时,为什么我需要在三次调用包装器调用时重新发送`ucfirst()`?为什么`slug`在那里?为什么不分开案例转换?整个事情感觉就像"哦,让我们在这里以某种方式抛出所有在弦上操作的方法"但是是啊...... Laravel ......`¯\ _(ツ)_ /¯` (3认同)
  • 他会把所有这些常见类型的功能放在哪里?只是在他的初始装载中包括?如果他有25个,那会慢下来吗?我正在阅读你给的链接,但我很困惑.你是说他应该在每个班级都使用相同的功能? (2认同)

Sau*_*aul 16

根据经验,助手应该包含常见的功能,但在应用程序的整体架构下没有特殊的名称.

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

简而言之:

// Helper sample
//
class ConversionHelper {

   static function helpThis() {
      // code
   }

   static function helpThat() {
      // code
   }
}

// Usage sample
//
class User {

   function createThings() {
      $received = ConversionHelper::helpThis();
   }
}
Run Code Online (Sandbox Code Playgroud)


ter*_*ško 6

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

代替:

class Helper {
    static function split_word($text) { ...
    static function split_char($text) { ...
}
Run Code Online (Sandbox Code Playgroud)

应该是

namespace Helper;

function split_word($text) { ...
function split_char($text) { ...
Run Code Online (Sandbox Code Playgroud)

将所有内容都集中在一个类中是没有意义的。仅仅因为你把它放在一个类中并不意味着它是面向对象的..实际上它的作用恰恰相反。