Подтвердить что ты не робот

Класс помощника в PHP

Я хочу создать вспомогательный класс, содержащий метод cleanArray, split_char, split_word и т.д.

Класс-помощник сам будет использоваться со многими классами. Пример:

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

какой лучший способ написать и использовать вспомогательный класс в PHP?

Я знаю, что это базовые знания ООП, которые в каждом классе, которые используют класс Helper, должны создать вспомогательный объект.

$helper = new Helper();

Это правильно или может быть кто-то может дать мне лучший способ сделать это.

Я также создам класс XXX, который может использовать классы A, B, C и т.д.

ОБНОВЛЕНИЕ: → ФИКСИРОВАННАЯ моя ошибка в методе 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   ٢ ٣  .,}{ + _"));
?>
4b9b3361

Ответ 1

Как правило, помощники должны содержать функциональные возможности, которые являются общими, но не имеют специального обозначения под общей архитектурой приложения.

  • Суффикс имени класса с Helper
  • По возможности используйте статические методы

Короче:

// Helper sample
//
class ConversionHelper {

   static function helpThis() {
      // code
   }

   static function helpThat() {
      // code
   }
}

// Usage sample
//
class User {

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

Ответ 2

Классы-помощники обычно являются признаком отсутствия знаний о предметной области модели и многие считают, что AntiPattern (или, по крайней мере, кодовый запах). Перемещение методов, где они принадлежат, например. на объектах, на которых они работают, вместо сбора дистанционно связанных функций в статических классах. Используйте Inheritance для классов, которые имеют одинаковое поведение. Использовать композицию, когда объекты по-разному отличаются друг от друга, но необходимо использовать некоторые функции. Или используйте "Черты".

Статический класс Utils, который вы часто найдете в PHP, является запахом кода. Люди будут бросать более или менее случайные функции в класс для их организации. Это нормально, если вы хотите сделать процедурное кодирование с помощью PHP < 5.2. Начиная с 5.3 вы группируете их в пространство имен. Если вы хотите сделать ООП, вы хотите избегать статических методов. Вы хотите, чтобы ваши объекты имели High Cohesion and Low Coupling. Статические методы достигают полной противоположности. Это также сделает ваш код менее подверженным тестированию.

Кроме того, каждый класс, использующий класс Helper, должен создать вспомогательный объект, это запах кода. Ваши соавторы не должны создавать других соавторов. Вместо этого переместите создание сложных графиков объектов на фабрики или строители.

Ответ 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) { ...

Нет никакого смысла обертывать все это в классе. Просто потому, что вы помещаете его в класс, он не делает его объектно-ориентированным.. на самом деле он делает точный oposite.

Ответ 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';