Челендж на 2026

ArbNet
На сайте с 27.10.2019
Offline
156
#631
Sly32 #:
Если честно - это гораздо интереснее твоего ФФ

Прикольная игрушка получилась.

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

ЗЫ. Больше ничего не расскажу и не покажу, код выкладывать не буду.

S3
На сайте с 29.03.2012
Offline
399
#632
ArbNet #:
Больше ничего не расскажу и не покажу, код выкладывать не буду.

значит ничего у тебя нет. То что ты описал - делается на расте за полчаса. 

А те модели, которыми ты пользуешься - просто смех. Для детей. Естественно что они ничего не умеют. 

Александр Воробьев
На сайте с 03.02.2020
Offline
69
#633
ArbNet #:
Давай, ради интереса, может другим пригодится.

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

Но в любом случае PHPStan поможет найти скрытые баги и сделать код надежнее, даже если структура проекта нестандартная.

Шаг 1. Необходимо установить PHPStan https://github.com/phpstan/phpstan

Тут два варианта

Вариант 1 Если очень не хочется composer:
Скачай готовый исполняемый файл phpstan.phar отсюда: https://github.com/phpstan/phpstan/releases

Вариант 2 Рекомендую этим воспользоваться.
1.1 Установить composer Инструкция тут https://getcomposer.org/download/
1.2 Ставим стан. php composer.phar require --dev phpstan/phpstan если композер поставишь в проект или если глобально composer require --dev phpstan/phpstan

Шаг 2. Создаем bootstrap.php он необходим т.к. у тебя своя автозагрузка. Просто скопируй свой run.php в нем оставь все функции, установку констант и регистрацию автозагрузчика. остальное (например установка обработчика ошибок) убирай. 
В общем убери всё, что выполняет действия прямо сейчас (кроме регистрации автозагрузчика). Иначе анализатор зависнет или упадет.

Шаг 3. Создаем конфиг в корне проекта файл phpstnan.neon

parameters:
    phpVersion: 80100
    bootstrapFiles:
        - bootstrap.php  # подключить существующий загрузчик
    level: 9  # начать с минимального уровня
    paths:
        - node/
        - skin/
        - mods/

Версию php установи какую тебе надо именно в том формате как в примере. (там 8.1)
bootstrap.php - файл который делали на втором шаге
level - от 0 до 9. По хорошему надо начинать с уровня 1 устранять все ошибки и повышать пошагово. На 9 уровне там пипец какие условия :). Возможно в твоем фреймворке 9ый не возможен.
paths - каталоги где могут быть исходники

Шаг 4 Запуск
Если выбрал первый путь php phpstan.phar analyse
Если выбрал второй путь php vendor/bin/phpstan analyse 

php phpstan.phar analyse /papth/to/file.php - так можно проверить только один файл

Конечно инструмент не скажет "вот это замени на это". Т.е. ошибку надо будет понять, проанализировать и исправить. Т.е. эта не халява отменяющая необходимость знаний. Этот инструмент только подсветит проблему.

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


Стан бдит за более строгой типизацией чем php. Т.е. если написать

/**
* @param list<int> Входящий параметр
* @result array<string,float> Результат
*/
function foo(array $props):array{
    ...
}

то стан будет проверять, что на вход передается НЕ ассоциативный массив содержащий только целые числа, а результат обрабатывается как ассоциативный массив где ключ - строка, а значение - флоаты. В случае массивов он, с определенного уровня, вообще будет требовать уточнения типа, т.е. без подобного phpdoc не пропустит.  ИМХО это все важно для проектов класса фреймворк (т.е. расcчитано, что будут пользоваться другие разработчики)
GitHub - phpstan/phpstan: PHP Static Analysis Tool - discover bugs in your code without running it!
GitHub - phpstan/phpstan: PHP Static Analysis Tool - discover bugs in your code without running it!
  • phpstan
  • github.com
PHP Static Analysis Tool - discover bugs in your code without running it! - phpstan/phpstan
Александр Воробьев
На сайте с 03.02.2020
Offline
69
#634
 ArbNet забыл важное добавить: в своем автозагрузчике (тот что перенесешь в bootstrap) убери выбрасывание ошибки при отсутствии класса
MP
На сайте с 05.05.2025
Offline
27
#635
Александр Воробьев #:

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

Но в любом случае PHPStan поможет найти скрытые баги и сделать код надежнее, даже если структура проекта нестандартная.

Шаг 1. Необходимо установить PHPStan https://github.com/phpstan/phpstan

Тут два варианта

Вариант 1 Если очень не хочется composer:
Скачай готовый исполняемый файл phpstan.phar отсюда: https://github.com/phpstan/phpstan/releases

Вариант 2 Рекомендую этим воспользоваться.
1.1 Установить composer Инструкция тут https://getcomposer.org/download/
1.2 Ставим стан. php composer.phar require --dev phpstan/phpstan если композер поставишь в проект или если глобально composer require --dev phpstan/phpstan

Шаг 2. Создаем bootstrap.php он необходим т.к. у тебя своя автозагрузка. Просто скопируй свой run.php в нем оставь все функции, установку констант и регистрацию автозагрузчика. остальное (например установка обработчика ошибок) убирай. 
В общем убери всё, что выполняет действия прямо сейчас (кроме регистрации автозагрузчика). Иначе анализатор зависнет или упадет.

Шаг 3. Создаем конфиг в корне проекта файл phpstnan.neon


Версию php установи какую тебе надо именно в том формате как в примере. (там 8.1)
bootstrap.php - файл который делали на втором шаге
level - от 0 до 9. По хорошему надо начинать с уровня 1 устранять все ошибки и повышать пошагово. На 9 уровне там пипец какие условия :). Возможно в твоем фреймворке 9ый не возможен.
paths - каталоги где могут быть исходники

Шаг 4 Запуск
Если выбрал первый путь php phpstan.phar analyse
Если выбрал второй путь php vendor/bin/phpstan analyse 

php phpstan.phar analyse /papth/to/file.php - так можно проверить только один файл

Конечно инструмент не скажет "вот это замени на это". Т.е. ошибку надо будет понять, проанализировать и исправить. Т.е. эта не халява отменяющая необходимость знаний. Этот инструмент только подсветит проблему.

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


Стан бдит за более строгой типизацией чем php. Т.е. если написать


то стан будет проверять, что на вход передается НЕ ассоциативный массив содержащий только целые числа, а результат обрабатывается как ассоциативный массив где ключ - строка, а значение - флоаты. В случае массивов он, с определенного уровня, вообще будет требовать уточнения типа, т.е. без подобного phpdoc не пропустит.  ИМХО это все важно для проектов класса фреймворк (т.е. расcчитано, что будут пользоваться другие разработчики)
Зачем на 9 ступене проверять? Я на 5 всегда прогоняю + юнит тестами покрываю
Александр Воробьев
На сайте с 03.02.2020
Offline
69
#636
MrPi #:
Зачем на 9 ступене проверять? Я на 5 всегда прогоняю + юнит тестами покрываю

Мне кажется в "Общем случае" в идеале проект должен проходить уровень 10 без ошибок. Но не всегда этот идеал оправдан. и тут уже зависит от конкретики проекта. И, как правило, например проекты подобные фреймворкам (т.е. пользоваться ими будут другие разработчики в разных проектах с разными взглядами и подходами) - чуть ли не обязаны. (правда у меня фреймворк остановился на 6ом, а шаблонизатор на 8. (надо будет освежить память "почему" :) )

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

А так вот подобрал примерчик (в комментариях на каком уровне появляется ошибка)

/**
* @param array{connection:string,status?:string} $row
*/

function foo(array $row): void{
        // 1 На уровне 7: Offset 'status' might not exist on array{connection: string, status?: string}.
        $status = $row['status'] ;
        echo  "test";
}
class Example {  
    public function test(?string $value): void {
                // 2 На уровне 8: Parameter #1 $string of function strlen expects string, string|null given.
        echo strlen($value);
    }
}

/**
* @param array<string,mixed> $data
*/

function foo1(array $data): string {
    $name = $data['name'];
        // 3 На уровне 9:  Function foo1() should return string but returns mixed.
    return $name;
}

1. Согласись потенциально возможное место для бага. Особенно если метод будет длинный.

2. Тут тоже от ситуации. Причем если пользователи только мы (и писали этот код не давно) еще ни чего. а вот если пользователь другой или мы через 100 лет. вдруг если передать null и результат 0 - это будет некорректно для логики.

3. Ну тут тоже повод для багов. вот упрощенные примеры

/**
* @param array<string,mixed> $data
*/

function bar(array $data): string {
    $name = $data['name'];
    return $name;
}

// ============================================
// Данные пришли из JSON API
// ============================================
$jsonInput = '{"name": null, "email": "test@example.com"}';
$data = json_decode($jsonInput, true);

$userName = bar($data);
    
$query = "INSERT INTO users (name) VALUES ('" . $userName . "')";
// INSERT INTO users (name) VALUES ('')  


/**
* @param array<string,mixed> $row
*/

function getUserName(array $row): string {
    return $row['name'];  
}

$dbRow = ['name' => null, 'email' => 'user@example.com'];
$name = getUserName($dbRow);
$query = "SELECT * FROM users WHERE name = '{$name}'";
// Выполнится: WHERE name = '' — вернёт всех пользователей с пустым именем!

(только не придирайся к выбранному примеру с именем пользователя - суть не в таких деталях :).  

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий