• Можно ли использовать простые функции внутри класса?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Да, можно.
    Ответ написан
    Комментировать
  • Как засунуть Content-Type audio/mpeg в плеер?

    SerJook
    @SerJook
    кодер
    Генерируйте плейлист (к примеру M3U-файл) с единственной записью, ссылающейся на ваш скрипт, и предлагайте скачать

    <?php
    header("Content-Type: audio/x-mpegurl");
    header("Content-Disposition: attachment; filename=\"playlist.m3u\""); ?>
    #EXTM3U
    
    #EXTINF:-1, Stream name
    http://example.com/stream.php
    Ответ написан
    Комментировать
  • Как засунуть Content-Type audio/mpeg в плеер?

    Compolomus
    @Compolomus Куратор тега PHP
    Комполом-быдлокодер
    Попробуйте сбросить буфер в переменную, не знаю можно ли передать сорцы в base64. С картинками работает
    Ответ написан
    Комментировать
  • Нужно ли передавать POST, GET, SESSION в класс?

    php666
    @php666
    PHP-макака
    Что бы писать качественные оо-приложения, для начала избавься от знания того, что есть все эти суперглобалы. Они, конечно, используются, но их надо "оборачивать" их классами-сервисами. Это нетривиальная работа - сделать сервис Session, в котором инкапсулировать всю логику по работе с сесиями, избавившись от нативных функций в коде. Суперглобалы GPR тоже обернуть, навесить на них некоторую логику. В целом тебе правильно сказали - любые значения надо "перебрасывать" в объекты. Напрямую их использовать не нужно. Твои классы должны быть черными ящиками с интерфейсом для входа параметров. А откуда параметры пришли - из GPRC или еще откуда - классы знать не должны.

    Я не претендую на истину, но я в своем фреймворке сделал вот такое решение:
    class Request implements Singleton
    {
        private function __construct()
        {
            $this->request_data = new RequestData($_REQUEST);
            $this->post_data = new PostData($_POST);
            $this->get_data = new GetData($_GET);
            $this->cookie_data = new CookieData($_COOKIE);
        }
    
        // ....

    Те при инстанцировании приложения я создаю объекты с копиями данных из запроса. На каждый из массивов свой объект:
    /**
     * Оболочка над GPCR массивами.
     */
    abstract class Data extends CoverArray
    {
        /**
         * @param array $data
         */
        public function __construct(array $data = array())
        {
            parent::__construct(self::clearData($data));
        }
    
        /**
         * Очищает массив от пробелов.
         *
         * @param array $in
         * @return array
         */
        private static function clearData(array &$in): array
        {
            if ($in && is_array($in)) {
                foreach ($in as $key => $value) {
                    if (is_array($value)) {
                        self::clearData($in[$key]);
                    } else {
                        $in[$key] = trim($value);
                    }
                }
            }
    
            return $in;
        }
    }
    
    class Post extends Data
    {
        /**
         * @param string $key
         * @param mixed $value
         */
        public function __set(string $key, $value)
        {
            parent::__set($key, $value);
    
            $_POST = $this->getDataAsArray();
        }
    
        /**
         * @param string $key
         */
        public function __unset(string $key)
        {
            parent::__unset($key);
    
            $_POST = $this->getDataAsArray();
        }
    }

    Класс-singelton Request доступен внутри контроллеров. Он создается в Application и передаетсяв конкретный контроллер. Соответственно, в контроллере я могу получить, например, POST так:
    $this->getRequest()->getPost('region')

    Тут особого профита как такового нет, но это - ООП-шно. Все классы объектов имеют интерфейсы, ничего из неоткуда не берется, как в случае с суперглобалами.

    А дальше больше - можем наложить логику. Например, санитарную обработку:
    echo $this->getRequest()->getPost('id', 'int'); // приведение к числу


    это был пост-запрос?
    echo (int) Request::isPost();

    изменился ли документ?
    if (!Request::IfModifiedSince($resource->getModificationTime())) {
        return $this->getResponse()->setHttpStatusCode(304);
    }

    т.е. любые обертки над суперглобалами неизбежно приводят к более приятному коду и повышают уровень возможностей.
    Ответ написан
    1 комментарий
  • Нужно ли передавать POST, GET, SESSION в класс?

    AleksandrB
    @AleksandrB
    Совсем недавно вывел "Hello world"
    Нет, не нужно
    Ответ написан
    Комментировать
  • Нужно ли передавать POST, GET, SESSION в класс?

    FanatPHP
    @FanatPHP
    Чебуратор тега РНР
    Всегда будут работать корректно, но надо передавать в виде сервиса,потому что глобальные переменные - это зло.
    Для примера можно посмотреть на Symfony HTTP foundation
    Ответ написан
    Комментировать
  • Как вывести данные из БД с ключами?

    @Arik
    Вроде готового нет, но как вариант заюзать array_column

    как-то так
    $data = array_column($stmt->fetchAll(), null, 'id');


    но нужно иметь виду что эта функция по разному ведет себя в php56 и php7
    Ответ написан
    1 комментарий
  • Можно ли вот так разделять класс?

    hack504
    @hack504
    Если нужно работать в рамках одного экземпляра класса то можно попробовать так
    class A{
      public $val = 10;
      public function method1(){
        $m2 = new B($this);
        return $m2->method2();
      }
    }
    
    class B {
      public function __construct($obj) {$this->obj = $obj;}
      public function method2(){
        return $this->obj->val + 1;
      }
    }
    
    $a = new A();
    echo $a->method1();

    Правда все методы и свойства класса должны быть только публичными, но судя по всему это не критично.
    Ответ написан
    2 комментария
  • Можно ли вот так разделять класс?

    Впринципе, можно. Но то, что класс А знает о своем наследнике, классе В - пахнет оооочень стрёмно.
    Ответ написан
    Комментировать
  • Можно ли вот так разделять класс?

    @ipokos
    Работать это будет. Если опишите в чем цель, возможно будет более адекватное решение. (например трейты)
    Но если вы "разделяете" класс, т.к. в нем много методов и вы хотите их структурировать, это значит изначально что-то пошло не так.
    Ответ написан
    3 комментария
  • Почему простой запрос тормозит?

    alex-1917
    @alex-1917
    Если ответ помог, отметь решением
    На SC тебя бы на ЙУХ послали бы сразу...
    Надо выдавать еще и схему БД, т.е. чтобы те, кто имеет немного времени, могли бы соорудить тестовую БД и сымитировать запрос, коли ты так боишься отладку запустить в БД.
    Но вот я имею до восьми вечера полчасика и таки собрал твою БД - НИ ХРЕНА ничо не тормозит!
    Я даже нагенерил 450к строк в первой таблице и 500 строк во второй.
    Тестировал на хостинг 30р в месяц
    Очевидно, ты что-то умалчиваешь...
    Ответ написан
    Комментировать
  • В чем отличие return bool, return array и Exception?

    seganim
    @seganim
    PHP-программист, программный инженер
    Можно возвращать код ошибки и интерпретировать. 0 - нет ошибок, 1 и далее -ошибки в соответствии с легендой.
    Ответ написан
    Комментировать
  • В чем отличие return bool, return array и Exception?

    wagoodoogoo
    @wagoodoogoo
    prestashop, webix, phalcon, vue, slim, craft cms
    Вот ещё одна хорошая статья на тему
    Ответ написан
    Комментировать
  • В чем отличие return bool, return array и Exception?

    amark
    @amark
    rush less, feel more
    Все три случая по-прежнему применяются. Всё зависит от ситуации.

    Вот хорошая статья, где описывается принцип, когда что возвращать чем отличается ошибка от exception.
    Ответ написан
    Комментировать
  • В чем отличие return bool, return array и Exception?

    Правильный - try{}catch(){}. Соответсвенно класс должен бросать Exception в любой непредвиденной ситуации, а код. который работает с этим классом, должен все исключения обрабатывать.
    Ответ написан
    3 комментария
  • Как передать объект БД в класс?

    amark
    @amark
    rush less, feel more
    Зачем вам дополнительный объект DB? Если он нужен только для инициализации подключения к базе, то вы просто так расходуете память.
    Фактически, вы сделали класс-обертку над PDO. Хотя в текущей реализации я не вижу в этом никакой необходимости.

    Я бы не стал усложнять то, что без усложнения работает. Зачем городить лишние классы и объекты??
    Идите от потребности. Надо контролировать создание подключения? — делайте initDB(), не надо контролировать, а объект всегда создается при объявлении App(), то и класс лишний не нужен.
    Как кто-то сказал: "усложнять — легко, упрощать — сложно". Не усложняйте себе жизнь))
    Ответ написан
  • Как передать объект БД в класс?

    ThunderCat
    @ThunderCat Куратор тега PHP
    {PHP, MySql, HTML, JS, CSS} developer
    Классический DI
    class App{
      protected $db;
      public function __construct($db){
        $this->db = $db;
      }
    }
    Ответ написан
    7 комментариев
  • Можно ли передать в функцию несколько значений?

    VladimirAndreev
    @VladimirAndreev
    php web dev
    func_get_args()
    Ответ написан
    Комментировать
  • Как обрезать длинное слово?

    @pocifis
    PHP-разработчик
    $text = preg_replace_callback('/[\w-]{21,}/ui',
        function ($matches) { 
            return mb_substr($matches[0], 0, 20); 
        },
    $text);


    Символ "-" добавил для слов через дефис, если не нужно, можете убрать.
    Ответ написан
    1 комментарий
  • Как обрезать длинное слово?

    @Dizzy221
    PHP Программист
    <?php
    $string = 'слово1, слово2 длинноолов1 слово3: слово4. длинноесловоболее20символов';
    
    function getWordsFromString($string)
    {
        if (preg_match_all("/\b(\w+)\b/ui", $string, $matches)) {
            return $matches[1];
        }
        return $matches;
    }
    
    $matches = getWordsFromString($string);
    
    	foreach($matches as $key => $m) {
    		if (mb_strlen($m, 'UTF-8') > 20) {
    			unset($matches[$key]);
    		}
    	}
    print_r($matches);


    Возвращает
    Array ( [0] => слово1 [1] => слово2 [2] => длинноолов1 [3] => слово3 [4] => слово4 )
    Ответ написан
    1 комментарий