我想创建一个包含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 ٢ ٣ .,}{ + _"));
?>
答案 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';