خانه زبان های برنامه نویسی ابزارهای جدید برای توسعهدهندگان PHP زبان های برنامه نویسی PHP نوشته شده توسط: تیم فنی نیک آموز تاریخ انتشار: ۲۳ تیر ۱۴۰۱ آخرین بروزرسانی: ۱۷ تیر ۱۴۰۳ زمان مطالعه: 15 دقیقه ۵ (۲) در این مقاله، با بررسی ابزارهایی که هم در خود زبان و هم بهعنوان مکمل در دسترس هستند، یک محیط توسعه جدید PHP را توضیح خواهم داد. امروزه با پیچیدگیهای موجود در توسعه وب، نمیتوانید زبان را بهتنهایی قضاوت کنید. شما باید از تمام فناوریهای که به شما در ایجاد نرمافزار باکیفیت بالا کمک میکند آگاه باشید. PHP مدرن چیست؟ قبل از پرداختن به ویژگیهای جدید PHP تعریف کلی دررابطهبا محیط توسعه مدرن PHP بیان میکنیم. وقتی به PHP مدرن اشاره میکنم، به نسخه ۷ و نسخههای بعدی اشاره میکنم، نسخههای ماقبل جز PHP مدرن محسوب نمیشوند. از زمان بازنویسی در نسخه ۵.۰، تکامل زبان و ابزارهای آن چشمگیر بوده است. PHP نسخه ۵.۰ نقطه عطفی را در تاریخ PHP مشخص کرد و آن را به قلمرو زبانهای شیءگرا واقعی رساند. یکی دیگر از جهشهای گسسته، معرفی Composer، یک ابزار برای مدیریت وابستگی در PHP بود که مطمئناً مرز بین توسعه آماتور و حرفهای را ترسیم کرد. برخی از پیشرفتهای عمده ایجاد شده در PHP را در چند نسخه اخیر مرور کنیم. بهبود زبان PHP از نسخه ۷ به بعد از زمان PHP نسخه ۷.۰ که در ۳ دسامبر ۲۰۱۵ منتشر شد، چندین ویژگی جدید هیجانانگیز مانند اعلان نوع، رمزنگاری داخلی، پشتیبانی از ساختارهای داده پیچیده، آرگومانهای نامگذاری شده معرفی شده است. هر نسخه جدید با بهبودهای عملکردی عمده نسبت به نسخه قبلی همراه بود. هر یک از این ویژگیهای جدید ممکن است برای کسی که PHP را سه یا چهار نسخه قبل ترک کرده است، بسیار شوکه کننده باشد. برای استفاده بیشتر از این ویژگیهای عالی، احتمالاً باید یک کاربر ماهر PHP باشید، بااینحال، برای کسانی که مبتدی تر از PHP استفاده میکنند، PHP ویژگیهای جدید دیگری را متناسب با موارد استفاده روزمره معرفی کرده است. اکنون که ویژگیهایی را که آخرین نسخههای PHP معرفی کردهاند درک کردهایم، بیایید جعبه ابزار خود را بسازیم. در بخشهای بعدی، برخی از ابزارهایی را که به نظرم در مورد توسعه نرمافزار حرفهای در PHP ضروری هستند، بحث خواهم کرد. آنها به ترتیب افزایشی ارائه میشوند. دیباگرها (Debuggers) قبل از معرفی دیباگرهایی مانند XDebug و ZendDebugger، توسعهدهندگان مجبور بودند زمان زیادی را صرف پیداکردن خطا در یک برنامه کنند. در عمل، اشکالزدایی شامل نگاهکردن به محتویات متغیرها در طول اجرای برنامه است. بهطورکلی، PHP در حالت دستهای استفاده میشود، به این معنی که خروجی تنها زمانی قابلمشاهده است که اسکریپت کامل شود، و این امر باعث میشود توسعهدهندگان حدس بزنند که خطا به چه علت به وجود آمده است. علاوه بر این، ابزارهای موجود برای این کار مانند var_dump، echo، و print_r خطر زیادی برای بهجاگذاشتن ردپایی دارند که به طور بالقوه اطلاعات حساس را در معرض دید قرار میدهند و باعث پایین آمدن امنیت سیستم میشوند. هر دو XDebug و ZendDebugger با IDE های مدرن مانند PhpStorm و VS Code بهخوبی کار میکنند تا مشکلات ذکر شده در بالا را حل کنند. اگر ترجیح میدهید مستقیماً از طریق خط فرمان (command line) بروید، phpdbg از نسخه ۵.۶ در دسترس است. مدیریت وابستگی (Dependency management) واردکردن کتابخانههای خارجی بهعنوان وابستگی در PHP دردسر واقعی بود. بااینحال، یکی از برجستهترین تغییرات در بلوغ PHP با انتشار Composer رخ داد. قبل از Composer، PHP از PEAR استفاده میکرد که همان مشکل را به روشی ابتدایی تر حل کرد. بهعنوانمثال، داشتن وابستگی پروژههای فردی با استفاده از PEAR پیچیده است. مدیریت وابستگی با PEAR یک وضعیت همه یا هیچ است، بنابراین اجرای چندین پروژه در یک سرور دشوار است، بهخصوص اگر هرکدام به مجموعهای متفاوت یا متضاد از وابستگیها بستگی داشته باشد. از طرف دیگر، مدیریت وابستگی با Composer بسیار سادهتر است. هر پروژه دارای پوشههای composer.json و vendor مخصوص به خود است که همه چیز را مستقل نگه میدارد. یکی دیگر از مزایای بزرگ Composer سیستم نسخهسازی آن است که دارای هوش داخلی برای تعیین بهترین تناسب برای درخت وابستگی است. به وابستگیهایی فکر کنید که وابستگیهای خاص خود را دارند. از طرف دیگر PEAR در این زمینه کار بسیار ضعیفی انجام میدهد. امروزه بهترین تمرین PHP نیازمند آشنایی با Composer است. اکثر ابزارهایی که ما پوشش خواهیم داد نیاز به دردسترسبودن آن در محیط کاری شما دارند. چارچوبهای MVC اگر در حال ساختن یک برنامه هستید، بهاحتمال زیاد قبل از اینکه بتوانید مشکل مشتری خود را حل کنید، مجبور خواهید بود کدهای تکراری زیادی ایجاد کنید. به مسائلی مانند احراز هویت، مسیریابی و مدیریت پایگاهداده فکر کنید. قبلاً در PHP، این یک چالش واقعی بود. امروزه فریمورکهای MVC زیادی وجود دارد که مهمترین آنها Symfony و Laravel هستند که میتوانید از آنها بهعنوان مبنایی برای کار خود استفاده کنید. Symfony و Laravel هر دو از پشتیبانی جامعه بزرگی برخوردار هستند تست خودکار ابزارهای تست خودکار به یک استاندارد در سراسر صنعت توسعه نرمافزار تبدیل شدهاند. هر زبانی ابزارهای مخصوص به خود را دارد و بزرگترین پخشکننده PHP قطعاً phpUnit است. phpUnit در ابتدا بهعنوان یک چارچوب تست واحد طراحی شده بود، اما ابزارهای دیگر به گسترش آن برای ارائه انواع دیگری از آزمایش مانند تست پایان و یکپارچهسازی کمک کردهاند. استفاده از phpUnit بسیار ساده است. مثلاً کلاسی مانند زیر دارید: <?php namespace LeewayAcademy; class Calculator { public function add(int $a, int $b): int { return $a + $b; } } با خواندن کد، احتمالاً تصور میکنید که کار خواهد کرد. اما با phpUnit میتوانید مجموعهای از تستهای تکرارپذیر را تعریف کنید که به شما در ایجاد و توجیه سطح اطمینان شما کمک میکند. بهعنوانمثال، یک مورد آزمایشی به شکل زیر خواهد بود: <?php use PHPUnit\Framework\TestCase; use LeewayAcademy\Calculator; class CalculatorTest extends TestCase { public function testAdd() { $sut = new Calculator(); $this->assertEquals(3, $sut->add(1, 2)); $this->assertEquals(10, $sut->add(5, 5)); $this->assertEquals(10, $sut->add(0, $sut->add(4, 6))); } } کد بالا متد افزودن را با مجموعههای مختلف ورودی اجرا میکند، سپس تأیید میکند که خروجی با آنچه انتظار میرفت مطابقت دارد. با استفاده از دستور زیر میتوانید تستها را با phpUnit اجرا کنید: php vendor/phpunit/phpunit/phpunit --no-configuration --filter CalculatorTest --test کد بالا یک خروجی مانند زیر تولید میکند: Testing started at 10:07 ... PHPUnit 9.5.11 by Sebastian Bergmann and contributors. Time: 00:00.006, Memory: 4.00 MB OK (1 test, 3 assertions) شما میتوانید این نوع تست را هرچند بار که بخواهید اجرا کنید. اگر همه آنها قبول شوند، مدرکی واقعی خواهید داشت که برنامه شما همان کاری را که قرار است انجام دهد انجام میدهد. البته، این ابزارها فقط بهخوبی تستهایی هستند که مینویسید که این مسئله بحث دیگری دارد. از دیگر ابزارهای شایانذکر میتوان به Codeception و behat اشاره کرد. هر دو از phpUnit استفاده میکنند، اما رویکردهای متفاوتی برای نوشتن تستها دارند. ابزارهای تحلیل استاتیکی (Static analysis tools) نبود تجزیهوتحلیل استاتیک برای PHP و دیگر زبانهای غیر کامپایل شده یک نقطهضعف بزرگ بود. برخی از باگها بهخوبی در مسیرهای اجرایی مبهم پنهان شده بودند که یافتن آنها در شرایط آزمایش عادی بسیار سخت بود. ما اکنون phpstan، Psalm، و Exakat را داریم. بهعنوانمثال، اشکال زیر را در نظر بگیرید: <?php function f(int $p): int { return $p * 2; } $a = 'M'; echo f($a); با ابزارهای تجزیهوتحلیل استاتیک، یک اشکال عدم تطابق نوع مانند مورد بالا را میتوان بدون اجرای کد، بهسادگی با صدور دستوری مانند زیر شناسایی کرد: vendor/bin/phpstan analyse test.php --level 5 کد بالا خروجی زیر را تولید میکند: ۱/۱ [▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓▓] ۱۰۰% ------ ---------------------------------------------------------- Line test.php ------ ---------------------------------------------------------- ۱۰ Parameter #1 $p of function f expects int, string given. ------ ---------------------------------------------------------- [ERROR] Found 1 error اکنون، شما اطلاعات بسیار دقیقی در مورد خطاهایی دارید که ممکن است در غیر این صورت نادیده گرفته شوند. با گنجاندن این ابزارها در خط یکپارچهسازی مداوم یا اجرای آنها بهعنوان بخشی از Git Hooks، میتوانید بهراحتی کیفیت کد خود را بهبود بخشید. ابزارهای استقرار (Deployment tools) کار یک برنامهنویس پس از نوشتن آخرین خط کد خود به پایان نمیرسد. برای دستیابی به مخاطب، برنامه شما ابتدا باید بروی یک سرور قرار بگیرد. با نسخههای قدیمیتر PHP، استقرار برنامه شما نیاز بهقرار دادن فایلهای جدید به یک مکان خاص دارد. احتمالاً باید بهروزرسانیهای پایگاهداده، مجوزهای دایرکتوری و بسیاری از کارهای کوچک دیگر را انجام دهید تا همه چیز را راهاندازی کنید. اغلب اوقات، ازدستدادن یکی از این اقدامات یا اجرای آنها به ترتیبی متفاوت، کل استقرار را با شکست مواجه میکند. درست مانند ابزارهای تست خودکار، اکوسیستم PHP ابزارهای خارقالعادهای برای تولید برنامه شما و بهروز نگهداشتن آن در صورت نیاز فراهم میکند و از سردردهای شدید جلوگیری میکند. برخی از این موارد عبارتاند از Deployer، Rocketeer، Pomander و easydeploy. بهعنوانمثال، در اینجا یک پیکربندی برای Deployer است که برای پروژه مشتری استفاده شده است: <?php namespace Deployer; require 'recipe/codeigniter.php'; // Project name set('application', 'APP'); // Project repository set('repository', 'git@bitbucket.org:maurochojrin/REPO.git'); set('branch', 'master'); set('default_stage', 'prod'); // [Optional] Allocate tty for git clone. Default value is false. set('git_tty', true); // Shared files/dirs between deploys add('shared_files', [ 'application/config/database.php', 'app_env.php', ]); add('shared_dirs', [ 'application/sessions', 'application/logs', 'assets/uploads/excel', 'logs', ]); // Writable dirs by web server add('writable_dirs', [ 'application/sessions', 'assets/uploads', 'application/logs', ]); // Hosts host('THE_HOST') ->stage('prod') ->identityFile('~/.ssh/MauroChojrin.pem') ->set('user', 'ubuntu') ->set('deploy_path', '~/{{application}}'); // Tasks task('build', function () { run('cd {{release_path}} && build'); }); task('pwd', function () { $result = run('pwd'); writeln("Current dir: $result"); }); // [Optional] if deploy fails automatically unlock. after('deploy:failed', 'deploy:unlock'); با این پیکربندی، هر زمان که نسخه جدیدی تولید میکنم، فقط باید دستور زیر را اجرا کنم: dep deploy اسکریپت از راه دور هر کار موردنیاز برای در دسترس قراردادن برنامه برای کاربران را اجرا میکند. اگر هنوز فایلها را از طریق FTP قرار میدهید، احتمالاً میخواهید این ابزارها را بررسی کنید. اجرای ناهمزمان (Asynchronous execution) یکی دیگر از شکایات رایج در مورد PHP عدم پشتیبانی اجرای ناهمزمان آن است. چند پروژه مانند Swoole و ReactPHP در این راستا وجود دارد. به کد زیر که از مخزن Swoole By Examples استخراج شده است نگاهی بیندازید: #!/usr/bin/env php <?php declare(strict_types=1); /** * How to run this script: * docker exec -t $(docker ps -qf "name=client") bash -c "time ./io/blocking-io.php" * * This script takes about 3 seconds to finish, and prints out "12". * * Here the PHP function sleep() is used to simulate blocking I/O. The non-blocking version takes about 2 seconds to * finish, as you can see in script "non-blocking-io.php". */ (function () { sleep(2); echo '1'; })(); (function () { sleep(1); echo '2'; })(); آن را با همتای غیر مسدود کنندهاش مقایسه کنید: #!/usr/bin/env php <?php declare(strict_types=1); /** * How to run this script: * docker exec -t $(docker ps -qf "name=client") bash -c "time ./io/non-blocking-io.php" * * This script takes about 2 seconds to finish, and prints out "21". * * Here the Swoole function co:sleep() is used to simulate non-blocking I/O. If we update the code to make it work in * blocking mode, it takes about 3 seconds to finish, as you can see in script "blocking-io.php". * * To see how the code is executed in order, please check script "non-blocking-io-debug.php". */ go(function () { co::sleep(2); echo '1'; }); go(function () { co::sleep(1); echo '2'; }); از نظر دستوری، آنها بسیار شبیه به هم به نظر میرسند، اما در زیر، نسخه دوم از قدرت Swoole برای پردازش موازی استفاده میکند و زمان لازم برای رسیدن به نتیجه نهایی را کاهش میدهد. در PHP نسخه ۸.۱، Fibers بهعنوان یک ویژگی خارج از بقیه ویژگیها معرفی شد. نتیجهگیری PHP راه درازی را پیموده است. متأسفانه، همه توسعهدهندگان PHP از این بهترین شیوهها پیروی نکردهاند، بنابراین هنوز هم میتوانید کدهای نامناسب زیادی را در آنجا پیدا کنید. بااینحال، این کدها مسئولیت یک فرد است و دلیلی بر کاستیهای یک ابزار نمیباشند. از طرف دیگر، منابع بسیار خوبی برای ارتقای سطح با PHP در صورت تمایل وجود دارد. امیدوارم از این مقاله لذت برده باشید. اگر قبلاً این کار را نکردهاید، امیدوارم اکنون از طرفداران PHP باشید، یا حداقل مایل به استفاده از آن باشید. امیدوارم با استفاده از زبان PHP بتوانید پروژههایی بسیار با کیفیتی تولید کنید. منبع چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۲ اولین نفر باش دانلود مقاله ابزارهای جدید برای توسعهدهندگان PHP فرمت PDF 9 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 366 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده تیم فنی نیک آموز مقالات مرتبط ۰۹ شهریور زبان های برنامه نویسی چگونه میتوان Blazor را برای ساخت برنامههای (PWA (App Web Progressive استفاده کرد؟ تیم فنی نیک آموز ۰۸ شهریور زبان های برنامه نویسی Eloquent در لاراول و جادوی کاربردیاش تیم فنی نیک آموز ۰۶ شهریور زبان های برنامه نویسی Interface در PHP تیم فنی نیک آموز ۰۶ شهریور زبان های برنامه نویسی پکیج در زبان گو؛ هر آن چیزی که باید بدانید! تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ