我想创建一个包含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对象才是代码味道.您的协作者不应该创建其他协作者.将复杂对象图的创建移动到工厂或构建器中.
Sau*_*aul 16
根据经验,助手应该包含常见的功能,但在应用程序的整体架构下没有特殊的名称.
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)
您应该只编写简单的函数,并将该文件包含在索引/引导文件中(您甚至可以使用命名空间),而不是创建静态类。
代替:
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)
将所有内容都集中在一个类中是没有意义的。仅仅因为你把它放在一个类中并不意味着它是面向对象的..实际上它的作用恰恰相反。