{"id":20162529,"url":"https://github.com/ging-dev/psalm-walkthrough","last_synced_at":"2026-05-05T16:37:36.007Z","repository":{"id":114722563,"uuid":"455846984","full_name":"ging-dev/psalm-walkthrough","owner":"ging-dev","description":"Sử dụng Psalm (PHP Static Analysis Linting Machine) trên vscode","archived":false,"fork":false,"pushed_at":"2022-02-05T13:11:41.000Z","size":9,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-13T14:19:16.250Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ging-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-05T11:08:51.000Z","updated_at":"2024-11-16T14:56:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"e33b7eaa-145f-4cc9-bdf2-a6c16b165a86","html_url":"https://github.com/ging-dev/psalm-walkthrough","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging-dev%2Fpsalm-walkthrough","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging-dev%2Fpsalm-walkthrough/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging-dev%2Fpsalm-walkthrough/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ging-dev%2Fpsalm-walkthrough/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ging-dev","download_url":"https://codeload.github.com/ging-dev/psalm-walkthrough/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241600484,"owners_count":19988713,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-14T00:25:33.681Z","updated_at":"2026-05-05T16:37:30.982Z","avatar_url":"https://github.com/ging-dev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Psalm là gì?\n\nPsalm được phát triển bởi Vimeo trong bối cảnh năm 2015 thì khối lượng codebase của Vimeo đã trở nên vô cùng lớn, phục vụ hàng triệu requests mỗi giờ.\n\nMặc dù codebase hiện tại vẫn hoạt động bình thường nhưng khi thay đổi code ở 1 file, để có thể biết được nó có ảnh hưởng đến các chức năng khác hay không thì chỉ có cách đẩy lên production và sẵn sàng rollback 😢 Refactor trở nên khó khăn và codebase vẫn tiếp tục trở nên phình to ra.\n\nVà Psalm đã được ra đời với các chức năng:\n\n- Hạn chế errors khi thực hiện nhiều refactor\n- Đảm bảo chất lượng code trong một team lớn\n- Đảm bảo không có lỗi nào liên quan đến kiểu dữ liệu khi chạy\n- Cung cấp công cụ tự động fix một số lỗi thông thường\n\n## Cài đặt Psalm trên vscode\n\nTrước tiên, hãy tìm psalm trong extensions của Visual Studio Code và cài đặt nó:\n\n![](https://imgur.com/gd8ZKXt.png)\n\nExtension này cung cấp language server giữa psalm và vscode.\n\nCài đặt psalm trong dự án của bạn thông qua `composer`:\n\n```bash\ncomposer require --dev vimeo/psalm\n```\n\nChạy lệnh:\n\n```bash\n./vendor/bin/psalm --init\n```\n\nPsalm sẽ scan tất cả các file trong dự án của bạn và tạo ra một file `psalm.xml`.\n\n## Sử dụng\n\nỞ đây mình tạo 1 file `example.php` có nội dung như sau:\n\n```php\n\u003c?php\n\ndeclare(strict_types=1);\n\nfunction sum($a, $b)\n{\n    return $a + $b;\n}\n```\n\nĐây là hàm tính tổng 2 hai biến `$a` và `$b`, nhìn thì có vẻ không có nó lỗi gì nhưng Psalm sẽ phát hiện ra lỗi tiềm ẩn trong đoạn mã của bạn:\n\n![](https://imgur.com/wPLsOU7.png)\n\nNó cho thấy rằng chúng ta chưa cung cấp `docblock` về kiểu dữ liệu cho `$a` và `$b` cũng như kiểu dữ liệu trả về của hàm `sum()`.\n\nGiờ hãy thử fix nó:\n\n```php\n\u003c?php\n\ndeclare(strict_types=1);\n\n/**\n * @param float|int $a\n * @param float|int $b\n *\n * @return float|int\n */\nfunction sum($a, $b)\n{\n    return $a + $b;\n}\n```\n\nOkay, vậy là mọi thứ đã an toàn!\n\n## ArrayShape\n\nPsalm còn hỗ trợ chúng ta kiểm tra dữ liệu trong mảng:\n\n```php\n/**\n * @param array{name: string} $a\n */\nfunction showInt(array $a): int\n{\n    return $a['name'] + 1; // Sẽ báo lỗi vì $a['name'] là string\n}\n```\n\n## Generics\n\n```php\n/**\n * @template T\n */\nclass Data\n{\n    /**\n     * @var T\n     */\n    private $data;\n\n    /**\n     * @param T $data\n     */\n    public function __construct($data)\n    {\n        $this-\u003edata = $data;\n    }\n\n    /**\n     * @return T\n     */\n    public function getData()\n    {\n        return $this-\u003edata;\n    }\n}\n\n/** @var Data\u003cstdClass\u003e */\n$data = new Data(new stdClass());\n\n// Sẽ báo lỗi vì $data-\u003egetData() trả về stdClass, bạn không thể echo nó\necho $data-\u003egetData();\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fging-dev%2Fpsalm-walkthrough","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fging-dev%2Fpsalm-walkthrough","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fging-dev%2Fpsalm-walkthrough/lists"}