PHP Пространство имен и автозагрузка классов

Редакция автор: stain

Интересно что namespace обязательно должен присутствовать в файле класса, а доступ к нему производится или установкой пространства имен или указанием полного имени класса или имени класса относительно установленного пространства имен.

Автозагрузка и зависимое от иерархии каталогов пространство имен. Классы, предполагается располагать по стандарту PSR-4.

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

Загрузчик AutoPSR-4.php


Пример обращения к функциям классов в файле index.php

test();
Z\Zed::test(); //расположен в models\Z\Zed.php
\controllers\Xclass::test(); // расположен вне текущего пространства имен в controllers\Xclass.php

Пример класса controllers\Xclass.php

класс Xclass';
    }
}

Вариант загрузчика в котором расположение файлов не имеет столь жесткой привязки.

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


Автозагрузчик composer`a.

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

Теперь в начале каждого класса пишем используемое пространство имён. У основных классов это:


А у контроллеров:



Обязательно следует добавить в файл проекта composer.json, связку имени вашего проекта с каталогом где вы его держите.

"autoload": {
        "psr-4": {
            "YourGitHubName\\NameProject\\": "public_html/"
        }
}

После этого нужно выполнить команду php composer.phar update, чтобы подключились пути автозагрузчика.

Тутто, тут, тут и тут можно подчерпнуть дополнительную информацию.

Комментариев: 0

PHP авто комментарии и документация

Редакция автор: stain

Расширение neilbrayfield.php-docblocker для VS Code подготавливает комментарии для классов, функций и методов, согласно их параметрам. Для того чтобы сформировать автокомментарий, наберите /**, и нажмите ввод.

Для подготовки автодокументации используется phpdocumentor
Скачиваем www.phpdoc.org/phpDocumentor.phar
1.Установка глобально, я кинул в каталог с php, создал там же phpDoc.cmd.

@set PHP_BIN=php.exe @set PHP_DIR=D:\web\tools\php\php-7.1-x64\
@"%PHP_BIN%" -d output_buffering=0 "%PHP_DIR%phpDocumentor.phar" %* 

Проверил phpdoc --version.

2.А теперь, находясь в директории проекта, который вы покрыли докблоками, просто запустите из консоли: phpdoc -d . -t ./src, -d/f указываем на директорий или файл по которому будет строиться хелп, -t указываем на каталог куда положим готовую документацию.

P.S.: Через композер, не получилось, зависимости не хотели разрешаться composer global require —dev "phpdocumentor/phpdocumentor:2.*".

После того как набрел на плагин в vscode, заметил еще статью по автодокументации.
Комментирование кода и генерация документации в PHP

Комментариев: 0

Подключение линтеров в VS Code

Редакция автор: stain

Выбираете в папке php конфиг для разработки и копируете его с именем php.ini.
Настройка конфигурации свежескаченого php. Например:

include_path = ".;d:/web/php/PHP-7.2-x64;d:/web/php/PHP-7.2-x64/PEAR/pear"
extension_dir = "D:/web/tools/php/php-7.2-x64/ext"
extension=openssl

Путь до php добавить в path windows.Например:
D:\web\tools\php\php-7.2-x64

Расположение глобальных пакетов. C:/Users/%USERNAME%/AppData/Roaming/Composer

Путь до батников расширений линтеров добавить в path windows.
C:\Users\%USERNAME%\AppData\Roaming\Composer\vendor\bin

Установка линтеров глобально.
Для ikappas.phpcs php composer.phar global require "squizlabs/php_codesniffer=*"
Для cerzat43.twigcs php composer.phar global require allocine/twigcs

Скачать php composer

Комментариев: 0

PHP используемые регулярные выражения

Редакция автор: stain

Пояснительные картинки к регулярным выражениям.

PHP поиск по регулярному выражению и вывод найденной подстроки.

Кривой паттерн ищет выражение типа 12*23

$pattern = '/[0-9]{2}[*]{1}[0-9]{2}/';
preg_match($pattern, $string, $matches);
echo $matches[0];

Удаление времени с помощью регулярных выражений

Использовал в sublime.
\d\d:\d\d
где \d любая цифра.

Комментариев: 0

PHP Удаление повторяющихся пробелов внутри строки.

Редакция автор: stain

Пример

$str = '3 ккв. 95.47 м2 в Кремлевские звезды секция ';
$str = preg_replace("/ {2,}/"," ",$str) // удаляет лишние пробелы внутри строки (больше 1 подряд).
$str = trim($str," "); // удаляет пробелы в конце строки и в начале, или подставляем символ который надо удалить.
echo $str;

Источники: 1, 2.

Комментариев: 0

PHP перекодировка и транслит

Редакция автор: stain

Иногда нужно чтобы русские имена оставались русскими. поэтому к примеру при загрузке файлов на сервер, нужно при выставленной локали в utf8, перекодировать результирующий файл в 1251, подобным образом $in_windows_1251=iconv("UTF-8", "windows-1251", $in_UTF);, где $in_UTF - строка в кодировке utf8

$in_windows_1251='Скачать всё';
$in_UTF=iconv("windows-1251", "UTF-8", $in_windows_1251);
echo $in_UTF.'
'; $in_UTF='Скачать всё'; $in_windows_1251=iconv("UTF-8", "windows-1251", $in_UTF); echo $in_windows_1251;

Обратный транслит.

По сути он мало чем отличается от обычного, Самый важный аспект, это очередность, надо выставлять в массиве переменные таким образом чтобы сначала шли все много-буквенные выражения, причем обе вариации Щ щ должны идти самыми первыми.Твердый знак конфликтовал с мягким заменил пока hh на hd для твердого.

function translitback($str) {
    $lat = array('Sch', 'sch', 'Ch', 'Sh',  'Hd', 'Ih', 'Jh', 'Eh', 'Yu', 'Ya', 'Gh','Yo', 'yo', 'ch', 'sh', 'hd', 'ih', 'jh', 'eh', 'yu', 'ya', 'gh', 'A', 'B', 'V', 'G', 'D', 'E', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C',  'a', 'b', 'v', 'g', 'd', 'e', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c');
    $rus = array(  'Щ',   'щ',  'Ч',  'Ш',   'Ъ',  'Ы',  'Ь',  'Э',  'Ю',  'Я', 'Ж',  'Ё',  'ё',  'ч',  'ш',  'ъ',  'ы',  'ь',  'э',  'ю',  'я', 'ж',  'А', 'Б', 'В', 'Г', 'Д', 'Е', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц',  'а', 'б', 'в', 'г', 'д', 'е', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц');
    return str_replace($lat, $rus, $str);
  }

Вызов.
$str = translitback($str);

Что еще можно сделать.

$str = str_replace("_"," ",$str);//замена подчеркиваний пробелами
$str = str_replace("-"," ",$str);//замена тире пробелами
$str = trim($zag);//убираем пробелы по бокам
$str = preg_replace("/ {2,}/"," ",$str);//убираем лишние пробелы внутри строки
$str = mb_convert_case($str, MB_CASE_TITLE, "UTF-8"); // верхний регистр первому символу строки

Остальное не так важно.
Я транслитил транслитил, и перетранслитил, и помог мне транслитер.
Проверено работает.

  function translit($str) {
    $rus = array('А', 'Б', 'В', 'Г', 'Д', 'Е', 'Ё', 'Ж', 'З', 'И', 'Й', 'К', 'Л', 'М', 'Н', 'О', 'П', 'Р', 'С', 'Т', 'У', 'Ф', 'Х', 'Ц', 'Ч', 'Ш', 'Щ', 'Ъ', 'Ы', 'Ь', 'Э', 'Ю', 'Я', 'а', 'б', 'в', 'г', 'д', 'е', 'ё', 'ж', 'з', 'и', 'й', 'к', 'л', 'м', 'н', 'о', 'п', 'р', 'с', 'т', 'у', 'ф', 'х', 'ц', 'ч', 'ш', 'щ', 'ъ', 'ы', 'ь', 'э', 'ю', 'я');
    $lat = array('A', 'B', 'V', 'G', 'D', 'E', 'E', 'Gh', 'Z', 'I', 'Y', 'K', 'L', 'M', 'N', 'O', 'P', 'R', 'S', 'T', 'U', 'F', 'H', 'C', 'Ch', 'Sh', 'Sch', 'Y', 'Y', 'Y', 'E', 'Yu', 'Ya', 'a', 'b', 'v', 'g', 'd', 'e', 'e', 'gh', 'z', 'i', 'y', 'k', 'l', 'm', 'n', 'o', 'p', 'r', 's', 't', 'u', 'f', 'h', 'c', 'ch', 'sh', 'sch', 'y', 'y', 'y', 'e', 'yu', 'ya');
    return str_replace($rus, $lat, $str);
  }
  echo translit("Всем привет!");

Еще вариант.
Можете проверить ))), мне хватило первого варианта.

function rus2translit($string) {
    $converter = array(
        'а' => 'a',   'б' => 'b',   'в' => 'v',
        'г' => 'g',   'д' => 'd',   'е' => 'e',
        'ё' => 'e',   'ж' => 'zh',  'з' => 'z',
        'и' => 'i',   'й' => 'y',   'к' => 'k',
        'л' => 'l',   'м' => 'm',   'н' => 'n',
        'о' => 'o',   'п' => 'p',   'р' => 'r',
        'с' => 's',   'т' => 't',   'у' => 'u',
        'ф' => 'f',   'х' => 'h',   'ц' => 'c',
        'ч' => 'ch',  'ш' => 'sh',  'щ' => 'sch',
        'ь' => '\'',  'ы' => 'y',   'ъ' => '\'',
        'э' => 'e',   'ю' => 'yu',  'я' => 'ya',
        
        'А' => 'A',   'Б' => 'B',   'В' => 'V',
        'Г' => 'G',   'Д' => 'D',   'Е' => 'E',
        'Ё' => 'E',   'Ж' => 'Zh',  'З' => 'Z',
        'И' => 'I',   'Й' => 'Y',   'К' => 'K',
        'Л' => 'L',   'М' => 'M',   'Н' => 'N',
        'О' => 'O',   'П' => 'P',   'Р' => 'R',
        'С' => 'S',   'Т' => 'T',   'У' => 'U',
        'Ф' => 'F',   'Х' => 'H',   'Ц' => 'C',
        'Ч' => 'Ch',  'Ш' => 'Sh',  'Щ' => 'Sch',
        'Ь' => '\'',  'Ы' => 'Y',   'Ъ' => '\'',
        'Э' => 'E',   'Ю' => 'Yu',  'Я' => 'Ya',
    );
    return strtr($string, $converter);
}
function str2url($str) {
    // переводим в транслит
    $str = rus2translit($str);
    // в нижний регистр
    $str = strtolower($str);
    // заменям все ненужное нам на "-"
    $str = preg_replace('~[^-a-z0-9_]+~u', '-', $str);
    // удаляем начальные и конечные '-'
    $str = trim($str, "-");
    return $str;
}

+ ниже требует доработки, глючит.

// Транслитерация строк.
function transliterate($st) {
  $st = strtr($st, 
    "абвгдежзийклмнопрстуфыэАБВГДЕЖЗИЙКЛМНОПРСТУФЫЭ",
    "abvgdegziyklmnoprstufieABVGDEGZIYKLMNOPRSTUFIE"
  );
  $st = strtr($st, array(
    'ё'=>"yo",    'х'=>"h",  'ц'=>"ts",  'ч'=>"ch", 'ш'=>"sh",  
    'щ'=>"shch",  'ъ'=>'',   'ь'=>'',    'ю'=>"yu", 'я'=>"ya",
    'Ё'=>"Yo",    'Х'=>"H",  'Ц'=>"Ts",  'Ч'=>"Ch", 'Ш'=>"Sh",
    'Щ'=>"Shch",  'Ъ'=>'',   'Ь'=>'',    'Ю'=>"Yu", 'Я'=>"Ya",
  ));
  return $st;
}
echo transliterate("У попа была собака, он ее любил.");

Комментариев: 0