Ага, ось ці хлопці, зараз я покажу Вам магію ООП.
Замість передмови. Про авторів мови
Точніше про траві яку курили розробники, ну як так можна іменувати функції? Ну візьмемо для прикладу функції для роботи з рядками:
- 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, а так само стануть непоганим матеріалом для вивчення початківцями програмістами…