Методы для скаляров

hell0w0rd

Продвинутый новичок
Я тут узнал, что в грамматиках phpstorm типы (string, int) не ключевые слова, и для автодополнения - это обычные классы (кроме array). Потом взял scalar_objects от nikic и набросал парочку хендлеров.
https://github.com/nkt/php-scalar - есть несколько методов для строк и массивов, как будет время, постараюсь добить все остальное.
 

Активист

Активист
Команда форума
Для автокомлпита.

Вообще не понятно, зачем нужны scalar_objects. Тогда уж лучше уйти от PHP.
 

Василий М.

Новичок
Я немного не понял... а зачем?
За шкафом. Зачем ты задаешь глупые вопросы?
Вообще не понятно, зачем нужны scalar_objects.
они ОЧЕНЬ нужны. Из-за того, что в PHP их нет этот язык и выглядит коряво.
Тогда уж лучше уйти от PHP.
куда ты от него денешься?

Никто из вас не критикует объект Datetime. Почему? Так это такой же тип данных, как строка или целое. В том плане, что в объекте сокрыта реализация туевой хучи разной бизнес-логики для работы с этим непростым типом данных.
Ничего плохого в объектах-скалярах нет. Начиная с того, что это красивый синтаксический сахар, кончая удобствами разработки.
Возможности расширять и/или наследовать базовые типы с возможностью добавления своих методов - отличное было бы решение.
У меня, скажем, есть расширение Datetime, один из методов которого умеет выводить дату как строку:
PHP:
<?php
class Krugozor_Module_Common_Type_Datetime extends DateTime
{

/**
    * Функция возвращает строковое человекопонятное представление времени.
    *
    * @param void
    * @return string
    */
    public function formatDateForPeople()
    {
        // Вчерашняя дата с 0 часов
        $yesterday_begin = mktime(0, 0, 0, date("m"), date("d") - 1, date("Y"));

        // Вчерашняя дата, за секунду до следующего дня.
        $yesterday_end = mktime(23, 59, 59, date("m"), date("d") - 1, date("Y"));

        if ($this->getTimestamp() >= $yesterday_begin && $this->getTimestamp() <= $yesterday_end)
        {
            return 'Вчера в '.$this->format('H:i');
        }
        else if ($this->getTimestamp() <= $yesterday_end)
        {
            return $this->format('d.m.Y H:i');
        }
        else
        {
            return 'Сегодня в '.$this->format('H:i');
        }
    }
У меня была идея сделать для скалярных типов объекты, но я ограничился супер-мега-классом для массива, который умеет все, даже кофе варить.
Попутно я все же пришел к объектам для некоторых типов данных.
Например:

PHP:
<?php
class Krugozor_Module_Common_Type_Url implements Krugozor_Module_Common_Type_Interface
{
    /**
    * URL адрес.
    *
    * @var string
    */
    protected $url;

    public function __construct($url)
    {
        $this->setValue($url);
    }

    public function getValue()
    {
        return $this->url;
    }

    public function setValue($value)
    {
        $this->url = $value;
    }

    /**
    * Создает "красивый" якорь из длинного URL-адреса. Например, после обработки строки
    * <pre>http://test/admin/user/edit/?id=38&referer=http%3A%2F%2Ftest%2Fadmin%2Fuser%2F</pre>
    * будет получена строка вида <pre>http://test/admin/article/edit/?id=...%26sep%3D1</pre>
    *
    * @param string $url гиперссылка
    * @param string $simbol символ- или строка- заполнитель
    * @param string $repeat количество повторений $simbol
    * @param int $ml_url_width_prefix количество символов, оставляемых спереди
    * @param int $ml_url_width_postfix количество символов, оставляемых позади
    *
    * @param void
    * @return string
    */
    public function getNiceAnchor($width_prefix = 20, $width_postfix = 10, $repeat = 3, $simbol = '.')
    {
        if (strlen($this->url) > $width_prefix + $width_postfix)
        {
            return substr($this->url, 0, $width_prefix) . str_repeat($simbol, $repeat) . substr($this->url, -$width_postfix);
        }

        return $this->url;
    }
}
естественно, у меня все куда сложнее, нежели просто тупо этот класс, с виду совершенно невзрачный, но по факту ORM достает объект сущности и св-во URL представлено именно в виде данного объекта. В шаблоне я вызываю:
PHP:
<tr>
    <td class="left-col description_td"><img class="adver_description_icon" src="/http/image/desing/icon/world.png" alt="" /> Веб-сайт:</td>
    <td><p><span data-url="<?=$this->user->getUrl()->getValue()?>" class="imitation_outer_link" onclick="imitationLink(this)"><?=$this->user->getUrl()->getNiceAnchor()?></span></p></td>
</tr>
 

fixxxer

К.О.
Партнер клуба
Никто из вас не критикует объект Datetime.
Я критикую. При наследовании от него все методы, которые возвращают новый инстанс DateTime, возвращают именно DateTime, а не то, что хочется. С тем же Carbon бывает нежданчик.

Не, я понимаю, что нефиг, и что на уровне расширений LSB/get_called_class() нету - так сделали бы final тогда уж.
 

Василий М.

Новичок
Я критикую. При наследовании от него все методы, которые возвращают новый инстанс DateTime, возвращают именно DateTime, а не то, что хочется.
а я сижу и пытаюсь вспомнить, зачем я так писал... ггг:D
PHP:
    /**
    * @see parent::createFromFormat()
    */
    public static function createFromFormat($format, $time, $timezone = null)
    {
        $datetime = parent::createFromFormat($format, $time, self::getBugTimezone($timezone));

        $this_instance = new self();

        return $this_instance->setTimestamp($datetime->getTimestamp());
    }
 

fixxxer

К.О.
Партнер клуба
Это еще ладно, там на тот же add() такое же веселье.

UPD: а, не, проверил. Все нормально. То ли это в Carbon было что-то странное, то ли более старая версия php, то ли я вообще гоню.
 

Вурдалак

Продвинутый новичок
Вопрос «зачем?» в смысле «а нахуа?». Если добавят scalar objects, то сам JetBrains тут же запилит. А использовать PoC nikic'а для production — это ж бред.
 

Активист

Активист
Команда форума
Либа - костыль. Она не нужна. Нужно делать так:
PHP:
$string = new String("Привет");
$string->length;

// Для любителей короткого синтаксиса
print (new String("Привет"))->length;
Это будет правильно со стороны PHP. А не этот PECL костыль "scalar object".
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
Вурдалак, это почему это нельзя использовать либу от nikic в продакшене? Вот от кого-кого, а от него вполне можно, трейты и генераторы же используешь?
А потом там кода 50 строк, все понятно, используется стандартное Zend api.
Активист, зря ты так. С этим "костылем" ты можешь внедрить прямо сейчас и писать новый код уже с ее использованием, а старый рефакторить по необходимости. Плюс есть только __toString, никаких __toFloat/__toBool/__toInt нету.
А также ты можешь использовать любую стороннюю либу и передавать в нее обычные скаляры.
 

Вурдалак

Продвинутый новичок
hell0w0rd, авторитет автора тут ни к месту, я про 1) это лишь PoC, мейнтейнится по приколу 2) такой PHP-код в дальнейшем нужно как-то поддерживать.

Если ты пишешь сайтик для себя — OK, пиши на этом пропатченном диалекте языка. Но для production'а использовать это безответственно. Расширять язык таким образом — это иметь потенциальные проблемы в будущем. Кто тебе вообще сказал, что, например, даже если scalar objects и появятся, то с таким API?

Ты просто играешься, такое поведение с точки зрения бизнеса будет угрозой. Production-ready решение — это когда сам vendor объявляет о поддержке и вводит фичу официально, гарантируя сохранение BC хотя бы в рамках major-версии.

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

P.S. Трейты — это кусок дерьма с точки зрения архитектуры, я это не использую. Кстати, если для тебя так важно мнение авторитета nikic'а, то его собственные слова: https://twitter.com/nikita_ppv/status/518355255617421312
nikic написал(а):
Yet another reason why traits were a bad idea.
P.P.S. Неа, генераторы тоже не использую. Здесь я ничего не имею против, но такой код мне просто редко приходится писать.
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Вурдалак, это почему это нельзя использовать либу от nikic в продакшене? Вот от кого-кого, а от него вполне можно, трейты и генераторы же используешь?
"От" - это когда по почте письмо придет. В данном случае - просто "либа nikic". Русский язык - не английский и не болгарский.
 
Сверху