Задать вопрос
  • Почему появляется Typed property must not be accessed before initialization?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Используйте Constructor property promotion чтобы писать меньше букв)
    <?php
    
    class Product
    {
        public function __construct(
            public int $id,
            public ?int $parentId = null
        ) {
        }
    
        public function getParentId(): ?int
        {
            return $this->parentId;
        }
    
    }
    
    $obj = new Product(1);
    if (!empty($obj->getParentId())) {
        echo 'ok';
    }


    Либо уберите типизацию у свойства и при public $parentId; ошибки не будет. Всё как и написано в тексте ошибки, нельзя обратиться к типизированному свойству до его инициализации, а значит нужно либо задать значение по умолчанию при описании свойства, либо через конструктор, либо вызвав setter.

    uninitialized и typed properties
    https://php.watch/versions/7.4/typed-properties#un...
    Ответ написан
    Комментировать
  • Почему появляется Typed property must not be accessed before initialization?

    @Vitsliputsli
    1. Разве по умолчанию свойства не null?
    2. У меня 20-30 свойств. Для каждого что-ли делать так? Код какой-то не логичный и громоздкий.

    1. Нет, в данном случае у свойства нет значения, оно не инициализировано. Какое значение вы хотите получить из свойства, если у свойства нет значения? То, что php в некоторых случаях при отсутствии типов выполняет неявное приведение к null не распространяется на ситуации, когда вы явно указали типы, а значит хотите явного поведения.
    А вот Null - это уже значение, которое используется для передачи отсутствия значения как значение.

    2. Если заботитесь о качестве кода, то да. Все абсолютно логично, php подсказывает вам, что вы вероятно забыли инициализировать переменную, т.е. допустили ошибку, обратившись к переменной раньше, чем положили в нее значение.
    Здесь нет ничего "громоздкого", просто вы явно описываете поведение. Можете этого, конечно, не делать, например не использовать указание типов и расчитывать на то, что php сам что-нибудь подставит - но, очевидно, это ненадежный путь, ведущий к ошибкам.
    В идеале, вы должны задать свойству корректное значение, а затем его использовать. Т.е. использовать 1 единственный тип. Не всегда логика это позволяет и тогда нужно инициализировать переменную значением null.

    Хороший код тот, который очевиден и понятен с первого взгляда, а не в котором мало букв. Указывая типы вы всегда знаете что за тип лежит в конкретной переменной и вам не нужно продумывать обработку других типов. Даже когда вы пишете ?int, значит кроме целого числа там еще и null может быть, и это придется учитывать при всех манипуляцих с этой переменной. И вот это, и будет делать код более сложным. А если вы не сделаете обработку всех доступных типов, тогда поведение кода может стать непредсказуемым.
    Ответ написан
    Комментировать
  • Почему появляется Typed property must not be accessed before initialization?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    1. Нет, по умолчанию типизированное свойство не инициализировано
    class Product
    {
        private int $parentId;
    
        private $nonTyped;
    
        public function __construct(
            private readonly int $id
        ) {
        }
    }
    
    $obj = new Product(1);
    var_dump($obj);
    
    // class \Product#2 (3) {
    //   private int $parentId => *uninitialized*
    //   private $nonTyped => NULL
    //   private readonly int $id => int(1)
    // }


    2. Если это свойство необязательное, то вариантов три:
    - не обращаться к свойству до его инициализации;
    - инициализировать свойство значением по умолчанию при определении;
    - делать коалесценцию в геттере, возвращая значение по умолчанию (return $this->parentId ?? null;).
    Ответ написан
    Комментировать
  • Делают ли приложения на двух и более активностях в 2024?

    Jacen11
    @Jacen11
    фрилансер? точно уже лет десять стараются сингл активити делать. Хотя некоторые думают, что это мода, это не так конечно
    https://www.youtube.com/watch?v=2k8x8V77CrU
    сам гугл рекомендует фрагменты использовать. Основная причина навигация, если касаться своих мелких приложений
    Ответ написан
    Комментировать
  • Делают ли приложения на двух и более активностях в 2024?

    Steel_Balls
    @Steel_Balls
    0KLRiyDQv9C40LTQvtGALiDQmNC00Lgg0L3QsNGF0YPQuQ==
    Это дань моде делать на одной активити, просто хайп, который тоже скоро пройдёт
    Ответ написан
    Комментировать
  • Делают ли приложения на двух и более активностях в 2024?

    402d
    @402d
    начинал с бейсика на УКНЦ в 1988
    Угу, а я еще подобных вопросов могу назадавать.
    Пишут ли приложения меньше 100 мегабайт в ХХХХ году ?
    Жива ли ява или котлин ее совсем вытеснил.
    Не пора ли забыть про лайоты и генерить интерфейс через код. (бррр до сих YII2 с отвращением вспоминаю)

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

    Нет серебряной пули. А в этом году их еще новых завезли.
    Ответ написан
    1 комментарий
  • Как передавать ArrayList между фрагментами?

    @My1Name
    Как передавать ArrayList между фрагментами?

    Обычно. Пока страница не построена, один объект используется во всех фрагментах.

    И самое главное, чтобы этот список можно было модифицировать и он, в обновленной версии, был доступен при смене фрагмента

    Фрагменты меняются только при перезагрузке страницы. Они компилируются и вы не можете менять данные после того, как страница уже на стороне клиента. Иначе нужно использовать JavaScript и/или ajax.

    чтобы этот список можно было модифицировать

    Создайте карту Map<key,ArrayList<?>> action; и храните в ней все изменения до логического завершения. Если у вас ProductFragment, значит по условию "payment" или пока пользователь online.
    Ответ написан
  • Как посмотреть массив до применения map?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    И что тут особенного? Объекты в JS копируются по ссылке.
    const a1 = [{ "id": "1" }, { "id": "2" }, { "id": "3" }];
    Здесь создаётся массив, в котором три ссылки на объекты.

    let a3 = [...a1];
    Здесь производится декомпозиция массива и из этих трёх ссылок формируется новый массив. Сами ссылки при этом остаются неизменными.

    let a4 = a1.slice();
    Опять таки, ссылки не меняются и ведут на те же самые объекты.

    const a2 = a1.map(i => {
        i["name"] = "Name" + i["id"];
        return i;
    });
    Здесь в объекты по ссылкам добавляется новое поле и как результат каллбэка возвращается ссылка на объект. Соответственно в a2 те же самые ссылки.

    В результате имеем четыре массива, в которых ссылки на одни и те же объекты.

    Чтобы не менять исходные объекты, надо из них строить новые:
    const a2 = a1.map((o) => ({ ...o, name: `Name${o['id']}` }));
    Ответ написан
    1 комментарий
  • Как сделать Recyclerview в три колонки?

    @WaterSmith
    Android-разработчик. Java, Kotlin
    Всё таки GridLayoutManager для этого предназначен, и 100 элементов это не то количество которое может тормозить. Нужно замерять где идет просадка по производительности, может вы что-о накосячили с обновлением списка.
    P.S. Предыдущий свой ответ удалил, ввиду его "костыльности".
    Ответ написан
    1 комментарий
  • Как сделать паузу между запросами?

    yarkov
    @yarkov
    Помог ответ? Отметь решением.
    Если на коленке накидать вариант, то что-то типа такого:
    const sleep = ms => new Promise(resolve => setTimeout(resolve, ms))
    
    await Promise.all(
      promises.map(async (promise, index) => {
        await sleep(index * 1000);
        promise();
      }
    };
    Ответ написан
    3 комментария
  • Почему не срабатывает функция?

    Fragster
    @Fragster
    помогло? отметь решением!
    https://developer.mozilla.org/en-US/docs/Web/API/E... уже не модно?
    а вообще если оставить только html, то будет вывод 1, а если добавить код на js, то он не добавит а заменит обработчик. А вот при использовании традиционного подхода работают все обработчики:
    <input type="button" value="START" id="test" onclick="console.log('1')" />

    const el = document.getElementById('test')
    
    el.addEventListener('click', () => console.log('2'));
    el.addEventListener('click', () => console.log('3'));
    Ответ написан
    1 комментарий
  • Какое ЮР лицо прописать в оферту и нужна ли она?

    В вашем случае оферту не нужно указывать, тк у вас нет никакого публичного договора.
    А раз его нет, то что вы вообще собираетесь в оферту писать?

    И раз фирма в беларуси и не имеет представительства в россии, то зачем делать домен ru?
    Ответ написан
    4 комментария
  • Как раскодировать windows-1251 используя iconv-lite?

    @xenonhammer Автор вопроса
    Оказалось, что дело в том что нужно дать axios нужные параметры
    Решение:
    axios.get(
            url,
            {
                responseType: 'arraybuffer',
                responseEncoding: 'binary'  
            })
    .then(response => iconv.decode(Buffer.from(response.data), 'windows-1251'))
    Ответ написан
    2 комментария
  • Как сделать фильтрацию массива?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    Про метод массива some уже написали выше.
    Я бы еще вынес некоторые условия из итерации:
    const brandsPredicate = s.hasOwnProperty("brands") && s.brands.length > 0
      ? product => s.brands.includes(product.brand_id)
      : () => true;
    const paramsPredicate = s.hasOwnProperty("params") && s.params.length > 0
      ? product => product.hasOwnProperty("params") &&
        s.params.some(param => product.params.includes(param))
      : () => true;
    
    const result = products.filter(product => brandsPredicate(product) && paramsPredicate(product));
    Ответ написан
    1 комментарий
  • Как сделать фильтрацию массива?

    @serpres
    Нужно добавить еще одно условие, которое проверяет, содержит ли массив product.params хотя бы один элемент из массива s.params. Для этого можно использовать метод
    Array.some()

    Примерно так:
    let result = products.filter(product => {
      let matchBrand = s.hasOwnProperty("brands") && s.brands.includes(product.brand_id);
      let matchParams = s.hasOwnProperty("params") && 
      product.hasOwnProperty("params") && 
      product.params.some(param => s.params.includes(param));
      return matchBrand && matchParams;
    });
    Ответ написан
    1 комментарий
  • Как скрыть источник попадания на страницу?

    vovka3003
    @vovka3003
    Фрилансер. Инженер систем безопасности.
    но чувствую, что будет видно, с какого я сайта. Серверы многое ведь что фиксируют.

    Дык реферер же браузер посылает. Смотрите в консоли...

    ZScVA1d.png
    Ответ написан
    Комментировать
  • Как скрыть источник попадания на страницу?

    @AUser0
    Чем больше знаю, тем лучше понимаю, как мало знаю.
    Для браузеров есть плагины, стирающие Referer из запросов. Вуаля, профит!
    Ответ написан
    Комментировать
  • Почему приложение Hello World занимает 10Мб?

    Stalker_RED
    @Stalker_RED
    Можно до единиц килобайт ужать, если выбросить все по максимуму, включая полезную нагрузку.
    https://habr.com/ru/post/339938/
    Ответ написан
    Комментировать
  • Почему приложение Hello World занимает 10Мб?

    @AlexVWill
    у скаченных не моих приложений, вес от 3х и выше

    Например? Какое приложение занимает всего 3Мб?
    Ответ написан
    2 комментария
  • Проблема с инициализацией фрагмента, как исправить ошибку?

    Jacen11
    @Jacen11
    Проблема с инициализацией фрагмента, как исправить ошибку?
    проблема что кое кто не хочет читать документацию
    когда я передаю в конструктор фрагмента - id категории
    нельзя так делать, вот тут инфа например https://tttzof351.blogspot.com/2014/06/android.html

    перед тем как воротить костыли, вначале изучи хотя бы с помощью гугла как правильно делать
    Ответ написан
    1 комментарий