Задать вопрос
  • В чем разница между namespace и use? И как они связаны с файловой системой?

    @MadridianFox
    Web-программист, многостаночник
    На уровне языка пространства имён с файловой системой никак не связаны.
    Пространства имён - лишь способ решить конфликты имён классов.
    Вот ты говоришь - у меня есть класс ClassName, но к сожалению, такой класс уже есть в одной из библиотек, которые ты используешь. Можно было бы назвать класс MyClassName, ну и везде добавлять приставку My. Редко, но бывает что надо сделать два класса с одинаковым именем в одном проекте. Тогда ты называешь один класс MyBananaSybsystemClassName, а другой MyAnanasSubsystemClassName - тем самым обозначая разницу в названии.
    И даже это не спасёт от простого совпадения.

    И тут на помощь приходят пространства имён.
    В начале файла в котором лежат классы (лучше один класс в одном файле) пишется название пространсва имён, вот так:
    namespace banana;
    И теперь все классы, объявленные в этом пространстве имён имеют название banana\ClassName, хотя внутри этого файлв ты можешь по прежнему обращаться к ним просто по ClassName.
    В другом файле надо использовать полное название, вроде как:
    $obj = new banana\ClassName();
    но, если надо много раз писать название класса можно сделать вот так:
    use banana\ClassName;
    $obj = new ClassName();

    , но самое полезное здесь это разрешение конфликтов. Если вдруг в другом месте определён такой же ClassName, то можно просто переименовать его:
    use banana\ClassName;
    use ananas\ClassName as AnanasClass;
    $obj1 = new ClassName();
    $obj2 = new AnanasClass();


    Вот это и есть суть пространства имён. Таковы они во всех языках программирования в которых они есть.
    Но есть от них ещё одна польза - можно настроить автоматическое подключение unclude(); файла с классом.
    Делается это с помощью определения функции автозагрузки
    function __autoload($classname){
    // как-то по имени класса находим файл и подключаем
    }
    // или, лучше
    spl_autoload_register(function ($classname) {
       // как-то по имени класса находим файл и подключаем
    });


    Каждый раз, когда ты обращаешься к классу и php не может его найти в подключенных файлах - запускается код написанный в функции автозагрузки. В эту функцию передаётся название класса.
    При чём же тут пространства имён? А при том, что в функцию автозагрузки передаётся полное имя класса с пространтсвом имён.
    Это значит что ты можешь делать по одному файлу на класс, класть их в папки, а в пространство имён в каждом файле писать путь до этого файла.
    После этого пишешь функцию, которая просто заменяет в названии класса слеши на те, что поддерживаются операционной системой как разделители пути, и просто подключаешь файл.
    Именно об этом и написано в каком-то там PSR
    Ответ написан
    2 комментария
  • Как сортировать ключи массива php по алфавиту и длине?

    @MadridianFox
    Web-программист, многостаночник
    Не изобретайте велосипед.
    Возьмите какую-нибудь реализацию стемминга на php и сделайте вот такую матрицу:
    $words = [
        "слово"=>["кол-во вхождений", "корень", "длинна слова"],
        ...
    ];

    где "корень" - это результат работы стемминг-функции над словом. Такие слова как Бык и Быки будут преобразованы к слову Бык.
    Далее эту матрицу сортируем во всем столбцам в том порядке в котором они указаны - по вхождениям, по корню, по длине. Таким образом, одинаково встречающиеся слова отсортированные по корню будут в алфавитном порядке, но когда корни одинаковые - будет играть роль их длинна.
    Ответ написан
    Комментировать
  • Как через xpath добраться до середины текста на php?

    @MadridianFox
    Web-программист, многостаночник
    XPath - способ добраться до элемента, но не редактирования DOM.
    Ответ написан
    Комментировать
  • "Сильные" книги по Symfony и архитектуре приложений?

    @MadridianFox
    Web-программист, многостаночник
    Мартин Фаулер - Шаблоны корпоративных приложений. Это как раз вторая ссылка что Вы сами указали. Эта книга не может быть старовата, т.к. поясняет общие принципы, которые применяются во всех фреймворках.
    Более того. Всякие Symfony-специфичные книги могут быть староваты, но не Фаулер.
    Ответ написан
    Комментировать
  • Как сменить версию php на xampp в ubuntu?

    @MadridianFox
    Web-программист, многостаночник
    Проблема всяких *AMP сборок в том что человек привыкает не "держать в руках" конфигурацию. Ну и ещё некоторые сборки грешат тем, что изменяют расположение конфигурационных файлов.
    Сейчас Вы вроде уже нашли решение, но в целом надо взять, потратить день и научиться всё ставить самостоятельно, тогда и проблемы смены версии не будет.
    В идеале надо потратить ещё день, и научиться работать с docker, т.к. проектов много, а ОСь одна, и постоянно менять на ней версии ПО не очень удобно.
    Ответ написан
    Комментировать
  • Как сконвертировать в utf 8 большой текстовый файл?

    @MadridianFox
    Web-программист, многостаночник
    Сомневаюсь что есть способ конвертировать файл в одну кодировку, когда разные его части имеют разную кодировку.
    И вообще, зачем понадобилось складывать всё в один файл?
    Не легче ли было записывать полученные данные в базу, ато файл на 40Гб...
    Ответ написан
    Комментировать
  • Как писать код сворачивать его фрагменты в NetBeans?

    @MadridianFox
    Web-программист, многостаночник
    Если у вас есть огромная простыня кода, которая не содержит "естественных" регионов которые можно скрыть, то значит что-то с вашим кодом не так.
    Лучшие практики всех популярных языков программирования говорят о том что тело функции должно помещаться на экране, а иногда и вообще быть не больше 10-15 строк.
    Бывают случаи когда большие куски кода оправданы, но если у вас они встречаются так часто что необходим способ их сворачивания...
    Ответ написан
    Комментировать
  • Как перечислить значения в условии?

    @MadridianFox
    Web-программист, многостаночник
    if(in_array($chislo,['1','2','3'])){}
    Ответ написан
    Комментировать
  • Как передать значение из масива?

    @MadridianFox
    Web-программист, многостаночник
    <input type="hidden" name="LMI_PAYEE_PURSE" value="<?=$webMoney['wmr'] ?>">
    Ответ написан
    Комментировать
  • Как сконструировать запрос, при котором leftJoin должен брать имя второй таблицы из ячейки первой?

    @MadridianFox
    Web-программист, многостаночник
    Сомневаюсь что вообще возможно в одном запросе использовать данные, хранимые в таблице, в качестве названия объектов БД.

    Скорее всего придётся делать дополнительные запросы, в иделае - по одному на каждую таблицу товара.

    А вообще такие вещи как товары, следует хранить используя EAV структуру.
    Ответ написан
    Комментировать
  • Ошибка при добавление в базу данных?

    @MadridianFox
    Web-программист, многостаночник
    Number of args (0) doesn't match number of placeholders (1)

    В ошибке говорится о том, что количество подставляемых значений ноль, а в запросе один плейсхолдер. Зачем нужен ?u в конце запроса?
    Либо это там не нужно, либо вы забыли передать параметр, который подставится на место знака вопроса (или на место ?u, зависит от БД и драйвера работы с ней).

    Кстати, почему вы вставляете данные из post в запрос без предварительной обработки? Именно для этого, отчасти, и предназначаются плейсхолдеры - они непозволят злоумышленнику передать в качестве одного из значений кусок sql,
    Ответ написан
  • Почему возникает такая ошибка при использовании foreach с объектом?

    @MadridianFox
    Web-программист, многостаночник
    Вы в цикле перезаписываете 2 элемента одного массива, а надо добавлять массив с двумя элементами:
    foreach ($serId as $catS) {
        if($catS->id_serial) {
            $idSer[]=[
                'id'=>$catS->id_serial,
                'nesting'=>'serial'
            ];
        }
    }
    Ответ написан
    Комментировать
  • Как создать sitemap.xml на PHP?

    @MadridianFox
    Web-программист, многостаночник
    Каким образом вы передаёте параметр $Page скрипту?
    Обычно, когда создают php приложение с единой точкой входа, используют mod_rewrite, ну и отрезают всё что идёт после домена, и присваивают отрезанное некоторому get параметру.
    Можно обойтись и без mod_rewrite, но тогда ссылки будут иметь вид index.php?page=index
    В первом случае необходимо в .htaccess добавить условие, что переданный путь не является файлом или папкой.
    Во втором случае, ничего не мешает поисковому боту, или кому угодно забрать этот xml файл из корня сайта, и делать дополнительных телодвижений по его отдаче не нужно.

    Если уж вам очень уж хочется сделать так как делаете, то необходимо не подключать xml файл, а читать его содержимое и выводить на страницу. Что-то вроде:
    case "sitemap.xml":  
        echo get_file_contents('sitemap.xml'); 
    break;
    Ответ написан
    Комментировать
  • Как сделать отдельные ссылки?

    @MadridianFox
    Web-программист, многостаночник
    Если вопрос лишь в том как обойтись без цикла и вставить значения в html теги, то вот:
    <a href="#wmr" tabindex="-1" data-toggle="tab">Пополнить через <?=$webMoney['wmr']?></a>
    <a href="#wmu" tabindex="-1" data-toggle="tab">Пополнить через <?=$webMoney['wmu']?></a>
    <a href="#wmz" tabindex="-1" data-toggle="tab">Пополнить через <?=$webMoney['wmz']?></a>

    Однако точно такого же результата можно добиться таки используя цикл:
    <?foreach( $webMoney as $key => $value ) : ?>
        <a href="#<?=$key?>" tabindex="-1" data-toggle="tab">Пополнить через <?=$value?></a>
    <?endforeach?>

    ведь такой цикл выводит текст и на странице получаются точно такие же, как вы говорите "полноценные" ссылки
    Ответ написан
    Комментировать
  • Как убрать вывод комментариев html тз php странички?

    @MadridianFox
    Web-программист, многостаночник
    Ну на самом деле код неправильно закомментирован. Нужно либо переносить строки, чтобы комментировать только код, но не открывающий и закрывающий php-теги
    либо использовать многострочный комментарий /* */ чтобы не зацепить закрывающий тег.
    Что качается комментирования кусков кода и сокрытия того что выводится php кодом, то тут есть два пути:
    1) замутить обработку выдаваемого html. Возможно используемый фреймворк/cms что-то такое умеет. Возможно придётся самому оборачивать всё в ob_start() а дальше регуляркой из конечного html вырезать комментарии.
    2) просто не оставлять комментарии. Используйте CVS чтобы была возможность посмотреть на старый код.
    Ответ написан
    Комментировать
  • Как реализовать чат (или почти чат) на СИ + php?

    @MadridianFox
    Web-программист, многостаночник
    Реализовать можно, однако PHP не очень подходит для организации чатов и подобных вещей, где сервер должен держать соединение с множеством клиентов и инициировать отправку данных.
    Лучше посмотреть в сторону NodeJS, go, Java, Python...

    В основе всех высокоуровневых протоколов взаимодействия компьютеров по сети лежит socket соединение. Когда ты работаешь в браузере, ты не можешь его использовать, у тебя есть только http (ajax это тоже http), грязные хаки, вроде long polling, ну и модный нынче WebSocket.

    Если клиент пишется на C, да и вообще на чём угодно что поддерживает сокеты, то тут даже гадать нечего. PHP имеет расширение для работы с сокетами. Раньше вроде считалось что оно не очень, и работают с ним одни извращенцы. Оно и понятно - PHP заточен под http.

    На самом деле необходимо придумать или реализовать уже известный, или даже взять библиотеку, в которой уже запрограммирован протокол общения между клиентом и сервером.
    По сути, так же как http с его заголовками и телом запроса является протоколом над TCP, то и вам необходимо придумать/ взять готовый протокол такого же уровня - над TCP.
    Ответ написан
    Комментировать
  • Как спроектировать сайт по поиску работы?

    @MadridianFox
    Web-программист, многостаночник
    Налицо неправильное разделение программы на модули. Наивно полагать что в модуле работника должна быть модель работника, поиск работника и, например личный кабинет работника из-за того, что все они относятся к работнику.
    Деление системы должно происходить после анализа предметной области и составления списка вариантов использования. При составлении вариантов использования, учитываются роли пользователей.
    В вашем случае чётко выделяются две роли - работник и работодатель. У каждого из них есть несколько возможностей на сайте - создать профиль/резюме/вакансию, искать чужой профиль/вакансию/резюме.

    При этом работодатель может создавать вакансию и искать резюме, а работник наоборот.
    Что это значит? Что во-первых модули надо компоновать именно так. А во-вторых - процессы, исполняемые представителями обеих ролей пересекаются. Модуль работодателя не имеет смысла, без модуля работника, т.к. если работник не создаст резюме, то работодателю нечего искать.
    Ну и в-третьих, оба модуля очень сильно связаны друг с другом. Модели придётся выносить наружу, чтобы использовать и там и там. Так зачем же модули?
    Ответ написан
    Комментировать
  • Как сделать, чтобы ссылки не обрывались?

    @MadridianFox
    Web-программист, многостаночник
    Ну так из БД она и вытягивается целиком. Обрезание происходит в при выводе на страницу.
    Я не знаю как это сделать быстро и грамотно, но на ум приходит поиск позиции начала и конца тегов ссылок регуляркой. Если вдруг оказывается что ссылка начинается до 400 символа, а заканчивается после, то значит она обрежется. В этом случае мы обрезаем не по 400, а по конец этой ссылки. Если у ссылок длинные анкоры, то можно немного посчитать и обрезать анкор внутри ссылки, сохраняя её функциональность.
    Ответ написан
  • Какой тут паттерн нужен?

    @MadridianFox
    Web-программист, многостаночник
    А нужен ли тут паттерн? Возможно стоило бы описать недостатки того что есть, хотелки, и спросить как этого добиться.
    Ответ написан
    2 комментария
  • Хватает ли использование одной датабазы Redis для проекта средней сложности?

    @MadridianFox
    Web-программист, многостаночник
    "Проект средней сложности" - это когда разработчику не так уж и сложно его реализовать. Кому-то не сложно в разумные сроки написать систему вроде этого же тостера, а кому-то сложно простой бложик на WP поднять.

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

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