Ага, ось ці хлопці, зараз я покажу Вам магію ООП.

Замість передмови. Про авторів мови

Точніше про траві яку курили розробники, ну як так можна іменувати функції? Ну візьмемо для прикладу функції для роботи з рядками:

  • str_replace( шукаємо рядок $search, замінюємо на $replace, в рядку $subject [, разом поміняли &$count ] )
  • strpos( в рядку $haystack , шукаємо $needle [, пропускаємо $offset символів] )
  • substr_replace( в рядку $string , заменям на $replacement , з позиції $start [, $length ])
  • nl2br( змінюємо рядок $string [, це $is_xhtml ] )

Як ми бачимо це дуже похмуро, а якщо брати масиви – в одному місці у нас функція повертає результат, в іншому – працює за посиланням… брр…

Завдяки отсутвию стандартів навіть в самій мові, ми маємо якийсь дискомфорт при роботі з даною мовою. Та й інші поглядають…

PHP це не ООП мова

Цю казку я частенько чую. Я вирішив її переписати 🙂

Вирішив, і переписав – на Ruby пару класів, які будуть представляти із себе обгортку для рядків і масивів. Дані класи включають в себе лише часто використовувані функції (на мою скромну думку), а виклик інших поклав на рефлексію.

Масив – oArray

Цей клас включає в себе наступні стандартні функції

  • array_diff — Обчислити розбіжність у масивах
  • array_fill — Заповнити масив певним значенням
  • array_filter — Застосовує фільтр до масиву, використовуючи функцію зворотного виклику
  • array_flip — Поміняти місцями значення масиву
  • array_key_exists — Перевірити, чи є в масиві вказаний ключ або індекс
  • array_keys — Вибрати всі ключі масиву
  • array_map — Застосувати функцію зворотного виклику до всіх елементів зазначених масивів
  • array_pop — Витягти останній елемент масиву
  • array_product — Обчислити добуток значень масиву
  • array_push — Додати один або кілька элеметов в кінець масиву
  • array_rand — Вибрати одне або кілька випадкових значень з масиву
  • array_reverse — Повертає масив з елементами в зворотному порядку
  • array_search — Здійснює пошук даного значення в масиві і повертає відповідний ключ у випадку удачі
  • array_shift — Витягти перший елемент масиву
  • array_slice — Вибрати зріз масиву
  • array_splice — Видалити послідовність елементів масиву і замінити її іншою послідовністю
  • array_sum — Обчислити суму значень масиву
  • array_unique — Прибрати повторювані значення з масиву
  • array_unshift — Додати один або кілька елементів в початок масиву
  • array_values — Вибрати всі значення масиву
  • sort — Відсортувати масив
  • rsort — Відсортувати масив у зворотному порядку
  • natsort — Відсортувати масив, використовуючи алгоритм “natural order”
  • natcasesort — Відсортувати масив, використовуючи алгоритм “natural order” не беручи до уваги регістр символів
  • ksort — Відсортувати масив за ключам
  • krsort — Відсортувати масив за ключем у зворотному порядку
  • implode — Об’єднує елементи масиву в рядок

А так само трохи корисної отсебячины:

  • to_url — Обгортка для http_build_query
  • clear — Прибрати порожні елементи масиву
  • odd — Залишити лише непарні елементи
  • even — Залишити лише парні елементи
  • size — Врапер для функції sizeof

Для всіх функцій виду array_* цей префікс я прибрав (адже ми і так знаємо, що працює з масивом), інші функції – на совісті методу __call і рефлексії.

Рядок – oString

Цей клас включає в себе наступні стандартні функції

  • addslashes — Екранує спецсимволи в рядку
  • count_chars — Повертає інформацію про символи, що входять в рядок
  • crc32 — Обчислює CRC32 для рядка
  • crypt — Необоротне шифрування (хешування)
  • explode — Розбиває рядок на підрядки
  • html_entity_decode — Перетворює HTML сутності у відповідні символи
  • htmlentities — Перетворює символи у відповідні HTML сутності
  • htmlspecialchars_decode — Перетворює спеціальні HTML-сутності назад у відповідні символи
  • htmlspecialchars — Перетворює спеціальні символи в HTML сутності
  • ltrim — Видаляє пробіли з початку рядка
  • md5 — Повертає MD5 хеш рядка
  • money_format — Форматує число як грошову величину
  • nl2br — Вставляє HTML код розриву рядка перед кожним переведенням рядка
  • number_format — Форматує число з розділенням груп
  • parse_str — Розбирає рядок в змінні
  • rtrim — Видаляє пробіли з кінця рядка
  • sha1 — Повертає SHA1 хеш рядка
  • sprintf — Повертає рядок відформатовану
  • str_pad — Доповнює інший текстовий рядок до заданої довжини
  • str_repeat — Повертає рядок повторюється
  • str_replace — Замінює рядок пошуку на рядок заміни
  • str_ireplace — Реєстро-незалежний варіант функції str_replace()
  • str_word_count — Повертає інформацію про слова, що входять до рядка
  • strip_tags — Видаляє HTML і PHP теги з рядка
  • stripslashes — Видаляє екранування символів, вироблене функцією addslashes()
  • strstr — Знаходить перше входження підрядка
  • stristr — Реєстро-незалежний варіант функції strstr()
  • strpos — Повертає позицію першого входження підрядка
  • stripos — Повертає позицію першого входження підрядка без урахування регістру
  • strrpos — Повертає позицію останнього входження символу
  • strripos — Повертає позицію останнього входження підрядка без урахування регістру
  • strrev — Перевертає рядок
  • strtolower — Перетворює рядок у нижній регістр
  • strtoupper — Перетворює рядок у верхній регістр
  • substr_count — Повертає кількість входжень підрядка
  • substr_replace — Замінює частину рядка
  • substr — Повертає підрядок
  • trim — Видаляє пробіли з початку і кінця рядка
  • ucfirst — Перетворює перший символ рядка в верхній регістр
  • ucwords — Перетворює у верхній регістр перший символ кожного слова в рядку
  • wordwrap — Виконує перенесення рядка на дану кількість символів з використанням символу розриву рядка

А так само трохи корисної отсебячины:

  • add — Конкатенація рядків
  • insert — Вставка рядка в рядок
  • size — Врапер для функції strlen

Для всіх функцій виду str_* str* цей префікс був прибраний.

Так само виділив функції для роботи з URL – і запхав їх в окремий клас (oUrl):

  • parse_url
  • urlencode
  • urldecode

Слайди

Тепер наведу приклад використання цього творіння:

oArray() // створюємо порожній масив
->range(0,100,10) // врапер для range
->size() // врапер для sizeof
;

Як Вам? Даю ще їжу для мозку:

oArray(‘module’, ‘controller’, ‘action’) // створюємо масив з елементів => array(‘module’, ‘controller’, ‘action’)
->combine(oArray(‘default’, ‘index’, ‘index’)) // врапер для array_combine => array(‘module’=>’default’, ‘controller’=>’index’, ‘action’=>’index’)
->to_url() // врапер для http_build_query повертає oUrl => module=default&controller=index&action=index
->insert(‘http://domain.com/?’) // додаємо шматочок рядка на початок => http://domain.com/?module=default&controller=index&action=index
->parse() // врапер для parse_url повертає oArray
->host // повертає array[‘host’] => domain.com
;

І ще:

oString(“it’s my way”)
->replace(‘my’,’your’) // str_replace => “it’s your way”
->sub(0, 8) // substr => “it’s you”
->pad(11, ‘.’) // str_pad => “it’s you…”
->repeat(2) // str_repeat => “it’s you…it’s you…”
->explode(‘…’) // отримуємо oArray => array(‘it’s you’,’it’s you’, “)
->clear() // видаляємо порожні елементи
->merge(array(‘Yes’,’No’), array(‘Maybe’)) // array_merge => array(‘it’s you’,’it’s you’, ‘Yes’,’No’,’Maybe’)
->implode(‘;’) // => it’s you;it’s you;Yes;No;Maybe
->get() // =>
;

Об’єкт – oObject

Навіть звичайний клас можна покращити, додавши йому хитрі гетери/сетеры властивостей об’єкта (я це підгледів в RoR):

class MyClass extends Object_Object {
// це дійсно protected властивість
protected $_protected;
// для даних полів можна визначити гетери/сетеры
protected $title;
protected $description;
// public властивість без гетеров/сетеров
public $data;
/**
* Сетер властивості title
*
* @param string $value
* @return mixed
*/
function setTitle($value) {
$this->title = ucfirst($value);
}
/**
* Геттер властивості title
*
* @return mixed
*/
function getTitle() {
return $this->title . ‘!!!’;
}
}
$MyClass = new MyClass();
$MyClass -> title = ‘article title’;
echo $MyClass -> title;

В результаті цього махінації ми отримаємо наступний результат:

Article title!!!

Як бачимо – подібний клас навіть має право на існування 😉

Ось таке недолуге творіння у мене вийшло, завантажити його можна за наступним посиланням:

Downloadlast versionoObject

P. S. Дані класи не претендують на життя в реальних проектах, вони призначені щоб розвіяти міф про не-ООП-ешности PHP, а так само стануть непоганим матеріалом для вивчення початківцями програмістами…