پی‌اچ‌پی

From Wikiversity

Template:جعبه اطلاعات زبان برنامه‌نویسی

پی‌اچ‌پی Template:انگلیسی یک زبان برنامه‌نویسی است که برای طراحی وب توسعه یافته‌است، اما می‌توان از آن به عنوان یک زبان عمومی نیز استفاده‌کرد. تا ژانویهٔ سال ۲۰۱۳ میلادی پی‌اچ‌پی بر روی ۲۴۴ میلیون وب‌گاه و ۲٫۱ میلیون سرور وب نصب شده‌است. [1] این زبان در سال ۱۹۹۵ میلادی توسط راسموس لِردورف Template:به انگلیسی ساخته‌شد و در حال حاضر توسعهٔ آن بر عهدهٔ گروه پی‌اچ‌پی می‌باشد. [2] در ابتدا پی‌اچ‌پی از عبارت صفحهٔ خانگی شخصی Template:به انگلیسی گرفته شده‌بود.[2] اما اکنون این کلمه مخففِ بازگشتی PHP: Hypertext Preprocessor به معنی پی‌اچ‌پی: پیش‌پردازندهٔ ابرمتن می‌باشد.[3]

کدهای پی‌اچ‌پی توسط یک سرور وب که نرم‌افزار پی‌اچ‌پی بر روی آن نصب باشد، تفسیر می‌شوند. دستورهای این زبان می‌توانند به صورت مستقیم در درون کدهای اچ‌تی‌ام‌ال قرار بگیرند. زبان پی‌اچ‌پی از نسخهٔ ۴٫۳ به بعد قابلیت پشتیبانی از واسط خط فرمان را نیز به امکانات خود اضافه کرد. این قابلیت می‌تواند برای ایجاد نرم‌افزارهای غیر وبی و یا نرم‌افزارهایی با واسط گرافیکی کاربر مورد استفاده قرار بگیرد. [4]

پی‌اچ‌پی یک نرم‌افزار آزاد است که تحت مجوز پی‌اچ‌پی انتشار یافته است. این مجوز به دلیل قرار دادن محدودیت بر روی استفاده از عنوان پی‌اچ‌پی، با مجوز همگانی گنو (GPL) سازگار نیست. پی‌اچ‌پی را می‌توان بر روی اکثر سرورهای وب نصب کرد. همچنین قابلیت نصب آن به صورت یک شل جداگانه بر روی تقریباً تمامی سیستم‌های عامل و پلت‌فرم‌ها (یا سکوها) وجود دارد.[5] تمامی این استفاده‌ها رایگان است.[6]

تاریخچه[edit]

Template:Triple image

توسعهٔ‌پی‌اچ‌پی از سال ۱۹۹۴ و زمانی که راسموس لردورف تعدادی اسکریپت به زبان سی نوشت تا صفحهٔ خانگی خود را مدیریت کند، آغاز شد. این اسکریپت‌ها که به صورت رابط دروازهٔ مشترک Template:به انگلیسی نوشته شده‌بودند، مسئول انجام عملیات‌های ساده‌ای مانند نشان دادن رزومهٔ راسموس و بررسی آمارهای بازدید از وب‌گاه او بودند.[2] با گسترش اسکریپت‌ها و افزودن توانایی تعامل با فرم‌های وب و ارتباط با پایگاه‌های داده، نام صفحهٔ خانگی شخصی/مفسر فرم Template:به انگلیسی یا PHP/FI برای آن‌ها انتخاب شد. PHP/FI می‌توانست برای ایجاد نرم‌افزارهای سادهٔ وب مورد استفاده قرار بگیرد. لردورف در ابتدا برای یافتن خطاهای این اسکریپت‌ها و بهبود آن‌ها، در ۸ جون سال ۱۹۹۵ میلادی اسکریپت‌ها را با نام ابزارهای صفحهٔ خانگی شخصی نسخهٔ ۱٫۰ Template:به انگلیسی تحت مجوز عمومی گنو بر روی گروه خبری یوزنت منتشر کرد.[7] این نسخهٔ اولیه بسیاری از ویژگی‌های نسخهٔ کنونی این زبان را دارا بود. متغیرها به سبک زبان پرل بودند، مدیریت فرم‌ها وجود داشت و می‌شد کدها را در درون کدهای اچ‌تی‌ام‌ال قرار داد. قواعد پی‌اچ‌پی نیز از زبان پرل پیروی می‌کردند، اما ساده‌تر، محدودتر و ناپایدارتر بودند.[2] با شکل‌گیری یک گروه برنامه‌نویسی و بعد از انجام تست‌های فراوان بر روی نسخهٔ بتا و بازنویسی موتور تجزیه‌کننده، سرانجام PHP/FI نسخهٔ ۲٫۰ در نوامبر سال ۱۹۹۷ میلادی منتشر گردید.[2]

اندی گاتسمن و زیو سوراسکی با بازنویسی موتور تجزیه‌کننده در سال ۱۹۹۷ میلادی، پایه و اساس نسخهٔ ۳ پی‌اچ‌پی را بنیان نهادند. این ۲ نفر با همراهی لردورف با تغییر نام پی‌اچ‌پی به پی‌اچ‌پی: پیش‌پردازندهٔ ابرمتن Template:به انگلیسی که یک مخفف بازگشتی است، در ماه جون ۱۹۹۸ میلادی رسماً پی‌اچ‌پی نسخهٔ ۳٫۰ را منتشر کردند.[2] بعد از این اتفاق گاتسمن و سوراسکی شروع به نوشتن هستهٔ جدیدی برای زبان پی‌اچ‌پی کردند که منجر به به‌وجودآمدن موتور زِند در سال ۱۹۹۹ میلادی شد. آن‌ها همچنین شرکت زِند تکنولوژی را در کشور اسرائیل تاسیس کردند.[8][9]

در تاریخ ۲۲ می سال ۲۰۰۰ میلادی پی‌اچ‌پی نسخهٔ ۴ که از موتور زند نسخهٔ ۱٫۰ استفاده می‌کرد، منتشر شد.[2] این نسخه تا ماه اوت سال ۲۰۰۸ میلادی توسعه یافت و به زیرنسخهٔ ۴٫۴٫۹ رسید. هم‌اکنون پشتیبانی این نسخه به پایان رسیده‌است و هیچ به‌روزرسانی برای آن منتشر نمی‌شود.[10][11]

در ۱۳ ژوئیه سال ۲۰۰۴ میلادی، نسخهٔ ۵ پی‌اچ‌پی که از موتور زند نسخهٔ ۲ بهره می‌برد، منتشر شد.[2] نسخهٔ ۵ ویژگی‌های زیادی را به پی‌اچ‌پی اضافه کرد. پشتیبانی کامل از شیء گرایی، افزونهٔ PDO Template:به انگلیسی (که دسترسی به بانک‌های اطلاعاتی را ممکن می‌ساخت) و بهبود بازدهی از جملهٔ این ویژگی‌ها محسوب می‌شد.[12] از سال ۲۰۰۸ به بعد، با پایان یافتن پشتیبانی از تمامی نسخه‌های قدیمی‌تر پی‌اچ‌پی، نسخهٔ ۵ تنها نسخهٔ در حال گسترش است.

در کنار نسخهٔ ۵ پی‌اچ‌پی یک نسخهٔ اصلی دیگر در حال توسعه است. با توجه به تغییرات عمدهٔ موجود در این نسخه از جمله پشتیبانی کامل از یونیکد، قرار بود این نسخه به عنوان نسخهٔ ۶ پی‌اچ‌پی منتشر گردد. اما پیاده‌سازی پشتیبانی از یونیکد بیش از آنچه انتظار می‌رفت به طول انجامید. این امر باعث شد تا در مارچ سال ۲۰۱۰ میلادی، این نسخه به بخش در حال توسعه Template:به انگلیسی منتقل شد و دیگر به آن نسخهٔ ۶ گفته نمی‌شود.

مهم‌ترین تغییرات این بخش جدید شامل حذف register_globals[13]، magic quotes و safe mode می‌باشد.[10] دلیل حذف magic quotes تاثیرات غیرقابل پیش‌بینی و دلیل حذف register_globals خطرهای امنیتی بود که در نرم‌افزارها ایجاد می‌کرد. به جای استفاده از magic qoutes برنامه‌نویس‌ها می‌توانند از تابع addslashes() و یا توابع دقیق‌تری که برای هر پایگاه داده ایجاد شده‌اند مانند mysql_real_escape_string() که برای پایگاه داده مای‌اس‌کیوال طراحی شده‌است، استفاده کنند. توابعی که قرار است در نسخهٔ ۶ حذف شوند، از نسخهٔ ۵٫۳ به صورت توصیه‌نشده Template:به انگلیسی درآمده‌اند و استفاده از آن‌ها باعث بروز هشدار در نرم‌افزار خواهد شد.[14]

تعداد بسیار زیادی از پروژه‌های بزرگ و متن‌باز که از زبان پی‌اچ‌پی استفاده می‌کنند، از سال ۲۰۰۸ با به وجود آمدن جنبش ابتکاری GoPHP5 به معنای برو به پی‌اچ‌پی ۵ دیگر از پی‌اچ‌پی نسخهٔ ۴ استفاده نمی‌کنند. این جنبش توسط بسیاری از توسعه‌دهندگان پی‌اچ‌پی پشتیبانی شد تا بتوانند به گسترش استفاده از نسخهٔ ۵ پی‌اچ‌پی کمک کنند.[15][16][17]

مفسرهای زبان پی‌اچ‌پی برای هر دو معماری ۳۲بیتی و ۶۴بیتی موجود می‌باشند. تنها استثنا سیستم‌عامل ویندوز است که فقط نخسه‌های ۳۲بیتی برای آن منتشر می‌شود. اما مدتی است که نسخه‌های ۶۴بیتی ویندوزی نیز به صورت امتحانی بر روی وب‌گاه پی‌اچ‌پی منتشر می‌شوند. استفاده از نسخه‌های امتحانی ۶۴بیتی ویندوز برای سرورهای بزرگ توصیه نمی‌شود.[18][19]

تاریخچه انتشار[edit]

جدول راهنما
رنگ مفهوم وضعیت توسعه
قرمز نسخهٔ قدیمی بدون توسعه
زرد نسخهٔ پایدار تنها به‌روزرسانی‌های امنیتی
سبز نسخهٔ پایدار به‌روزرسانی فعال
آبی نسخهٔ آینده امکانات جدید
نسخه تاریخ انتشار تاریخ اتمام پشتیبانی[20] یادداشت‌ها
۱٫۰ ۱۹۹۵/۰۶/۰۸ این نسخه به صورت رسمی "Personal Home Page Tools" یا "PHP Tools" نامیده شد. کلمهٔ پی‌اچ‌پی اولین بار در اینجا به کار رفت.[2]
۲٫۰ ۱۹۹۷/۱۱/۰۱
۳٫۰ ۱۹۹۸/۰۶/۰۶ ۲۰۰۰/۱۰/۲۰ توسعه‌دهندگان از یک به چند نفر افزایش یافتند. زیو سوراسکی و اندی گاتمنس هستهٔ این نسخه را بازنویسی کردند.[2]
۴٫۰ ۲۰۰۰/۰۵/۲۲ ۲۰۰۱/۰۱/۲۳ سیستم دومرحله‌ای تجزیه/اجرای پیشرفته تحت عنوان موتور زند به این نسخه اضافه شد.[21]
۴٫۱ ۲۰۰۱/۱۲/۱۰ ۲۰۰۲/۰۳/۱۲ متغیرهای فوقِ سراسری(Superglobal) معرفی شدند. (GET، $_POST، $_SESSION و...)[21]
۴٫۲ ۲۰۰۲/۰۴/۲۲ ۲۰۰۲/۰۹/۰۶ تنظیم register_globals به صورت پیش‌فرض غیرفعال شد. با این تغییر اطلاعاتی که از طریق شبکه ارسال می‌شدند، دیگر به طور مستقیم در محدودهٔ متغیرهای فوقِ سراسری قرار نمی‌گرفتند. این نکته مشکلات امنیتی احتمالی بسیاری از نرم‌افزارها را برطرف کرد.[21]
۴٫۳ ۲۰۰۲/۱۲/۲۷ ۲۰۰۵/۰۳/۳۱ واسط خط فرمان یا همان CLI به این نسخه اضافه شد.[21]
۴٫۴ ۲۰۰۵/۰۷/۱۱ ۲۰۰۸/۰۸/۰۷ صفحات راهنما(man page) برای درستورات phpsize و config-php اضافه شد.[21]
۵٫۰ ۲۰۰۴/۰۷/۱۳ ۲۰۰۵/۰۹/۰۵ موتور زند نسخهٔ ۲ معرفی شد.[22]
۵٫۱ ۲۰۰۵/۱۱/۲۴ ۲۰۰۶/۰۸/۲۴ بهبود بازدهی با معرفی متغیرهای مترجم (Compiler Variables) در موتور جدید پی‌اچ‌پی. [22] مدل PDO به عنوان یک رابط پایدار برای برقراری ارتباط با بانک‌های اطلاعاتی معرفی شد. [23]
۵٫۲ ۲۰۰۶/۱۱/۰۲ ۲۰۱۱/۰۱/۰۶ افزونهٔ فیلتر (Filter Extension) به صورت پیش‌فرض فعال شد. پشتیبانی از جی‌سَن (JSON) افزوده شد.[22]
۵٫۳ ۲۰۰۹/۰۶/۳۰ ژوئیه ۲۰۱۴[24] پشتیبانی از namespace ، late static binding ، دستور jump (نسخهٔ ضعیف شدهٔ دستور Goto) و زباله جمع‌کن. پشتیبانی بهتر از سیستم‌عامل ویندوز. پشتیبانی از اس‌کیوال‌لایت نسخهٔ ۳. کتابخانهٔ Mysqlnd جایگزین کتابخانهٔ libmysql (که مسئول برقراری ارتباط با بانک‌اطلاعاتی مای‌اس‌کیوال بود) شد. افزونهٔ fileinfo که کارایی بهتری در مورد MIMEها دارد، جایگزین افزونهٔ mime_magic شد. افزونهٔ بین‌الملل (Internationalization) اضافه شد و توابع ereg از دور خارج شدند.
۵٫۴ ۲۰۱۲/۰۳/۰۱ ۳ سال بعد از انتشار[25] پشتیبانی از Trait. پشتیبانی از آرایه‌ها با فرمت کوتاه. سرور وب داخلی[26]. بهبود کارایی و استفاده از حافظه به میزان کمتر.Template:سختوابع حذف شده: register_globals, safe_mode, allow_call_time_pass_reference, session_register
۵٫۵ ۲۰۱۳/۰۶/۲۰ ۳ سال بعد از انتشار[25] جنراتورها افزوده شدند(Generators). بهینه‌ساز زند+ (Zend Optimizer+) افزوده شد.[27]
۵٫۶ مشخص نشده ۳ سال بعد از انتشار[25] قابلیت بازنویسی عملگرها (Operator Overloading). ایجاد تغییرات در GMP یا GNU Multiple Precision.[28]

از تاریخ ۲۸ جون سال ۲۰۱۱ میلادی، گروه پی‌اچ‌پی برنامه‌ای مدون برای انتشار نسخه‌های آیندهٔ این زبان را منتشر کرد.[25] بر اساس این برنامه هر ماه یک انتشار جزئی و هر سال یک انتشار اصلی اتفاق خواهد افتاد. از هر نسخه از پی‌اچ‌پی تا ۳ سال پشتیبانی می‌شود. تا ۲ سال تمامی به‌روزرسانی‌ها و سال سوم تنها به‌روزرسانی‌های امنیتی برای هر نسخه منتشر می‌شود.

ساختار[edit]

برنامه Hello World زیر با استفاده از زبان پی‌اچ‌پی که در درون کدهای اچ‌تی‌ام‌ال قرار گرفته‌است، نوشته شده:

<!DOCTYPE html>
<meta charset="utf-8">
<title>PHP Test</title>
<?php
 echo 'Hello World';
?>

از آنجایی که پی‌اچ‌پی نیازی ندارد که در درون کدهای اچ‌تی‌ام‌ال قرار بگیرد یا بر روی سرور وب اجرا شود، کوتاه‌ترین برنامه Hello World پی‌اچ‌پی به صورت زیر است:

<?= 'Hello world';

مفسر پی‌اچ‌پی تنها کدهایی که در درون جداکننده‌های پی‌اچ‌پی قرار بگیرند را تفسیر می‌کند. معروف‌ترین جداکننده‌های پی‌اچ‌پی علامت <?php و ?> است. جداکننده‌های دیگری مانند <script language="php"> و </script> یا جداکنندهٔ کوتاه <? یا <?= (که برای خروجی دادن متن یا متغیر استفاده می‌شود) و <% یا <%= و %> نیز وجود دارند. تمامی نوشته‌هایی که در خارج از جداکننده‌های پی‌اچ‌پی قرار بگیرند، توسط مفسر تفسیر نشده و به عنوان خروجی ارسال خواهند شد. استفاده از جداکننده‌های کوتاه می‌تواند از قابلیت حمل برنامه بکاهد، از آنجا که این جدا کننده‌های توسط تنظیمات پی‌اچ‌پی قابل غیرفعال‌سازی هستند. از این رو استفاده از این جداکننده‌ها توصیه نمی‌شود.[29] هدف تمامی این جداکننده‌ها این است که کد پی‌اچ‌پی را از قسمت غیر-پی‌اج‌پی مانند اچ‌تی‌ام‌ال جدا کند.[30]

نام متغیرها در زبان پی‌اچ‌پی حتماً باید با نماد دلار آغاز شود و نیازی به مشخص کردن نوع آن‌ها نیست. برخلاف نام توابع و کلاس‌ها نام متغیرها به بزرگی و کوچکی حروف حساس هستند. خطوط جدید و فاصله‌ها نادیده گرفته شده (به جز فاصله‌هایی که در درون رشته‌ها قرار داشته باشند) و تمامی دستورهای این زبان با علامت سمی‌کولن (;) پایان می‌یابند.[31] در زبان پی‌اچ‌پی به ۳ صورت متفاوت می‌توان کامنت گذاشت. از علامت‌های /* */ برای کامنت‌های چندخطی و از علامت‌های // یا # برای کامنت‌های یک خطی استفاده می‌شود.[32]

بندانگشتی|چپ|مقایسه ۲ حالت کد پی‌اچ‌پی از نظر ساختار کلی و کلمات کلیدی، پی‌اچ‌پی مانند بسیاری از زبان‌های سطح بالا از قواعد زبان سی پیروی می‌کند. اما برای تمام ساختارهای کنترلی قواعد نوع دومی نیز وجود دارد که می‌توان از آن‌ها مانند ساختار اصلی بهره برد.[33] این قواعد نوع دوم مانند زبان‌های خانوادهٔ بیسیک است.

انواع داده[edit]

زبان پی‌اچ‌پی داده‌های عددیِ صحیح را بر اساس نوع پلت‌فرم ذخیره می‌کند. در سیستم‌های ۳۲بیتی و ۶۴بیتی به ترتیب اعداد صحیح به‌صورت ۳۲ و ۶۴بیتی ذخیره می‌شوند. اعداد بدون‌علامت در عملکردی که مانند هیچ‌کدام از زبان‌ها برنامه‌نویسی دیگر نیست، در موقعیت‌هایی به اعداد علامت‌دار تبدیل می‌شوند.[34] اعداد صحیح می‌توانند با مبنای ده (به صورت مثبت یا منفی یا مثبت)، در مبنای ۱۶، در مبنای ۸ و یا در مبنای ۲ مقداردهی شوند.[35] اعداد اعشاری نیز باتوجه به پلت‌فرم ذخیره می‌شوند. این اعداد را به صورت اعشاری ساده و یا ۲ حالت از نمایش علمی می‌توان مشخص کرد.[36] پی‌اچ‌پی مانند زبان‌های جاوا و سی++ به‌صورت پیش‌فرض داده‌های بولی (صحیح و غلط) را در خود تعریف کرده‌است. بر اساس قوانین تبدیل متغیرها در این زبان، تمامی متغرهای غیر صفر به صحیح و تمامی متغیرها با مقدار صفر به غلط تبدیل می‌شوند.[37] عملکردی مشابه در زبان پرل و سی++ وجود دارد. نوع داده‌ای به نام نال (null) نیز در این زبان وجود دارد. متغیر نال هیچ مقداری ندارد. تنها متغیر از نوع نال NULL (کلمهٔ نال با حروف بزرگ) است.[38] داده‌هایی که از نوع منبع (Resource) هستند، نمایان‌گر اشاره‌گرهایی به منابع خارجی می‌باشند. این نوع متغیرها توسط خانوادهٔ خاصی از توابع که از معمولاً در یک افزونه قرار دارند ایجاد شده و تنها توسط همین خانواده از توابع قابل استفاده است. داده‌هایی مانند فایل‌ها، تصاویر و اتصال‌ها به پایگاه‌های داده مثال‌هایی از منابع خارجی هستند که نیاز به متغیرهای منبع دارند.[39] آرایه‌ها می‌توانند اعضایی از تمامی انواع داده‌ای که پی‌اچ‌پی از آن‌ها پشتیبانی می‌کند، را در خود داشته‌باشند. ترتیت در آرایه‌های پی‌اچ‌پی حفظ می‌گردد. آرایه‌ها در واقع جداول درهم‌سازی هستند که می‌توانند برای هر عضو خود یک کلید داشته‌باشند. در صورتی که کلیدی برای عضو مشخص نگردد، مانند آرایه‌های معمولی، به‌صورت خودکار از اعداد به‌عنوان کلید استفاده می‌گردد. این شماره گذاری از عدد صفر آغاز می‌شود. همچنین اعضای با کلید و بدون کلید می‌توانند در کنار هم در یک آرایه قرار بگیرند.[40] پی‌اچ‌پی داده‌های رشته‌ای نیز دارد. رشته‌ها می‌توانند در درون علامت ' یا قرار گرفته و یا با قواعد نوداک (nowdoc) و هیِرداک (heredoc) نوشته‌شوند.[41]

کتابخانه استاندارد پی‌اچ‌پی (SPL : Standard PHP Library) در تلاش است تا بتواند انواع داده‌های استاندارد را به بهترین نحو توسط کلاس و اینترفیس پیاده‌سازی کند. این داده‌ها شامل لیست پیوندی، پشته، صف و ... می باشد.[42]

توابع[edit]

زبان پی‌اچ‌پی صدها تابع پایه و هزاران تابع افزونه دارد. اکثر این توابع به‌خوبی بر روی وب‌گاه پی‌اچ‌پی متسندسازی شده‌اند. نام‌گذاری توابع پایهٔ این زبان از قوانین یکسانی و مشخصی پیروی نمی‌کند.[43] پی‌اچ‌پی تاکنون توابعی برای پشتیبانی از رشته‌های اجرایی (Thread) ارائه نکرده‌است اما از سیستم‌های چندپردازنده پازیکس (POSIX) پشتیبانی می‌کند.[44]

توابع جدید می‌توانند به شکل زیر تعریف شوند:

function myNameFunction() { // تابع را تعریف می‌کند
 return 'John Doe'; // مقداری را بازمی‌گرداند
}

echo 'My name is ' . myNameFunction() . '!';
// خروجی متن مقابل خواهد بود: 'My name is John Doe!'

در نسخهٔ ۵٫۲ و نسخه‌های قبل آن توابع دست اول نبوده و تنها به‌صورت مستقیم و یا غیرمستقیم با نام‌شان قابل فراخوانی هستند.[45] توابع پی‌اچ‌پی می‌توانند بدون نوشتن نمونه اولیه (Prototype) تعریف شوند.[45] تعریف توابع می‌تواند در درون بلاک‌های شرطی قرار بگیرند تا در شرایط خاص تعریف شود. تمامی توابع پی‌اچ‌پی در هنگام فراخوانی باید در جلوی خود پرانتز داشته‌باشند. متغیرهایی که با دستور new ساخته می‌شوند در صورتی آرگومان نداشته‌باشند، از این قاعده مستثنی هستند. پی‌اچ‌پی قابلیت تعریف توابع بدون نام را ندارد اما می‌توان با قرار دادن نام یک تابع در متغیر، تابع را به‌صورت غیرمستقیم فراخوانی کرد.[45]

از نسخهٔ ۵٫۳ به بعد می‌توان با استفاده از قابلیت بستار (Closure) ، توابع بدون‌اسم را به صورت زیر تعریف کرد:

function getAdder($x) {
 return function($y) use ($x) {
  return $x + $y;
 };
}

$adder = getAdder(8);
echo $adder(2); // خروجی عدد ۱۰ خواهد بود

در تکه‌کد بالا تابع getAdder به کمک متغیر $x یک بستار تعریف می‌کند که متغیر $y را به‌عنوان ورودی می‌گیرد. این نوع تابع یک شیء دست اول است به این معنی که می‌توان آن‌را در یک متغیر نگاه داشت، می‌توان به‌عنوان ورودی آن‌را به توابع دیگر داد و استفاده‌های دیگری از آن کرد. (توضیحات کامل‌تر در وب‌گاه ویکی پی‌اچ‌پی موجود است.)

دستور goto نیز در زبان پی‌اچ‌پی به‌شکل زیر قابل استفاده است:

function lock() {
 $file = fopen('file.txt', 'r+');
 retry:
 if (!flock($file, LOCK_EX | LOCK_NB)) {
  goto retry;
 }
 fwrite($file, 'Success!');
 fclose($file);
}

هنگامی که تایع flock فراخوانده می‌شود، پی‌اچ‌پی سعی می‌کند تا فایلی را قفل کند. کلمه‌ای که قبل از علامت : در ابتدای خط قرار می‌گیرد، نام خط را مشخص می‌کند.(در اینجا retry) این نام را می‌توان در دستور goto به‌عنوان مقصد مورد استفاده قرار داد. مقصدهای دستور goto در زبان پی‌اچ‌پی باید درون فایل و محیط جاری باشند. پشتیبانی از این دستور از نسخهٔ ۵٫۳ به پی‌اچ‌پی افزوده شده‌است.[46]

اشیاء[edit]

قابلیت برنامه‌نویسی شیءگرایی به‌صورت ابتدایی در نسخهٔ ۳ به زبان پی‌اچ‌پی افزوده و در نسخهٔ ۴ بهتر شد.[2] این قابلیت که در نسخهٔ ۵ کاملاً بازنویسی شده‌بود با افزایش قابلیت‌ها و بهبود عمل‌کرد در درون زبان قرار گرفت.[47] در نسخه‌های قبلی پی‌اچ‌پی، با اشیأ مانند یک نوع داده برخورد می‌شد.[47] بنابراین باید در هر بار مقداردهی و یا ارسال شیء به یک تابع، کل محتویات شیء در یک فضای حافظه جدید کپی شود. اما در نسخهٔ ۵ نحوهٔ مدیریت اشیأ تغییر کرد. از این پس اشیأ با یک اشاره‌گر به فضای حافظه مشخص می‌شوند نه با مقادیرشان. در کنار این بهبودها مفاهیم جدیدی مانند متغیرهای شخصی (Private member variables) و عمومی (Public member variables) و همچنین کلاس‌های انتزاعی (Abstract Class)، کلاس‌های نهایی (Final Class) وبسیاری موارد دیگر نیز معرفی شدند. نحوهٔ تعریف متدهای سازنده (Constructors) و تخرب‌کننده (Destructors) نیز مانند زبان سی++ استانداردسازی شد و راه حلی برای مدیریت خطاها و استثناها ارائه گردید. علاوه‌بر این موارد، پی‌اچ‌پی ۵ قابلیت استفاده از اینترفس‌ها (Interface) را نیز معرفی و از پیاده‌سازی چندین اینترفیس در یک کلاس پشتیبانی کرد. در این میان اینترفیس‌های خاصی برای برقرار کردن رابطه با ساختارهای زبان به‌وجود آمدند. برا مثال با کلاس‌هایی که اینترفیس ArrayAccess را پیاده‌سازی کنند، می‌توان مانند آرایه‌ها برخورد کرد.[48]

اگر شخص برنامه‌نویس با استفاده از کلمهٔ کلیدی clone سعی کند که یک شیء را کپی کند، موتور زند ابتدا بررسی می‌کند که متد __clone در درون کلاس تعریف شده‌است یا خیر. در صورتی که تعریف نشده‌باشد، متد پیش‌فرض __clone فراخوانی می‌شود که تمامی خصوصیات کلاس را کپی می‌کند. اما اگر این متد در کلاس وجود داشته‌باشد، مسئولیت کپی کردن و مقداردهی در کلاس کپی‌شده بر عهدهٔ این متد خواهد بود.[49]

یک نمونه‌کد ابتدایی از برنامه‌نویسی شیءگرا به زبان پی‌اچ‌پی به‌شکل زیر است:

class Person {
 public $firstName;
 public $lastName;

 public function __construct($firstName, $lastName = '') {
  $this->firstName = $firstName;
  $this->lastName = $lastName;
 }

 public function greet() {
  return "Hello, my name is " . $this->firstName . " " . $this->lastName . ".";
 }

 public static function staticGreet($firstName, $lastName) {
  return "Hello, my name is " . $firstName . " " . $lastName . ".";
 }
}

$he = new Person('John', 'Smith');
$she = new Person('Sally', 'Davis');
$other = new Person('iAmine');

echo $he->greet(); // prints "Hello, my name is John Smith."
echo '{{سخ}}';
echo $she->greet(); // prints "Hello, my name is Sally Davis."
echo '{{سخ}}';
echo $other->greet(); // prints "Hello, my name is iAmine."
echo '{{سخ}}';
echo Person::staticGreet('Jane', 'Doe'); // prints "Hello, my name is Jane Doe."

میدان دید متغیرها و متدهایی که در درون کلاس‌های پی‌اچ‌پی تعریف می‌شوند به‌وسیلهٔ کلمات کلیدی public، private و protected مشخص می‌گردند. کلمهٔ کلیدی var نیز که در نسخه‌های قدیمی‌تر استفاده می‌شد، هم‌اکنون معادل public می‌باشد. متدها و خاصیت‌های public در همه‌جا قابل دسترسی هستند. protected دسترسی آن‌ها را به کلاس‌های مشتق‌شده (Inherited Class) محدود کرده و private دسترسی را فقط برای کلاس تعریف‌کننده میسر می‌سازد.[50] در پی‌اچ‌پی اشیائی از یک نوع می‌توانند به متدها و خاصیت‌های خصوصی (private) یکدیگر دسترسی داشته‌باشند. در بسیاری از موارد، قابلیت‌های میدان دید در این زبان مفید دانسته می‌شود.[51] با این حال عده‌ای نیز آن‌ها را ناکارآمد می‌دانند.[52]

پیاده‌سازی‌ها[edit]

زبان پی‌اچ‌پی در ابتدا به صورت یک زبان مفسری پیاده‌سازی شد و امروزه نیز این پیاده‌سازی پرکاربردترین نسخهٔ مورد استفاده است. تعدادی مترجم نیز برای این زبان ایجاد شده‌است که این زبان را از مفسرها دور می‌کند. مترجم‌ها در زمان اجرا، قابلیت آنالیز ایستا (Static Analysis) و رابطهٔ بهینه با زبان‌های دیگر نسبت به مفسرها برتری دارند.

از مترجم‌های مطرح زبان پی‌اچ‌پی می‌توان به فالانگر که کد پی‌اچ‌پی را به بایت‌کد زبان میانی مشترک (CIL) تبدیل می‌کند، و هیپ‌هاپ که به صورت منبع‌باز توسط فیس‌بوک توسعه داده می‌شود، اشاره کرد. مترجم هیپ‌هاپ با تبدیل کد پی‌اچ‌پی به کد زبان سی++ می‌تواند سربار سرور را تا ۶ برابر کاهش دهد.[53]

از روش‌های دیگری که برای بهبود زمان اجرا مورد استفاده قرار می‌گیرد، می‌توان از بهینه‌سازی کد نام برد. این عمل با کاهش حجم کد، حذف و ادغام قسمت‌های تکراری و تغییرات متفاوت دیگر صورت می‌گیرد. قابلیت بهینه‌سازی کد در زبان پی‌اچ‌پی نیز موجود بوده، و برنامه‌ها و افزونه‌هایی مانند eAccelerator برای این منظور توسعه داده می‌شوند.[54]

برای کاهش سربار ترجمه در زبان پی‌اچ‌پی می‌توان از حافظه نهان برای کدهای عملیاتی (Opcode Caching) نیز استفاده کرد. در این روش دستورهای ترجمه‌شده، در حافظهٔ مشترک (Shared Memory) قرار می‌گیرند تا از ترجمهٔ مجدد آن‌ها جلوگیری شود. از نسخهٔ ۵٫۵ به بعد افزونه Zend Opcache که از این روش برای افزایش کارایی استفاده می‌کند، به صورت پیش‌فرض به زبان پی‌اچ‌پی افزوده شد.[55] از نمونه‌های دیگر حافظهٔ نهان برای کدهای عملیاتی می‌توان به Alternative PHP Cache (APC) اشاره کرد.[56]

پروانه انتشار[edit]

پی‌اچ‌پی یک نرم‌افزار آزاد است که با پروانه پی‌اچ‌پی منتشر می‌شود.[6] این پروانه علاوه بر قوانین موجود در نرم‌افزارهای آزاد اعلام می‌دارد که:

تمامی محصولاتی که بر پایهٔ پی‌اچ‌پی گسترش می‌یابند، نباید بدون اجازهٔ قبلی از group@php.net از نام "PHP" برای نام‌گذاری استفاده کنند. شما می‌توانید با قرار دادن کلمهٔ "for PHP" (به‌معنای برای پی‌اچ‌پی) در نام محصول خود نشان دهید که محصول شما با زبان پی‌اچ‌پی کار می‌کند. مثلاً استفاده از نام "PHP Foo" غیرمجاز است، در حالی‌که استفاده از "Foo for PHP" بدون مشکل خواهد بود.

وجود این محدودیت در پروانهٔ این زبان، آن را با پروانه عمومی همگانی گنو (GPL) ناسازگار می‌کند.[57]

نصب و تنظیمات[edit]

به طور کلی دو روش اصلی برای نصب زبان پی‌اچ‌پی بر روی سرورهای وب وجود دارد. در بسیاری از سرورهای وب یک ماژول مستقیم به نام Server Application Programming Interface یا SAPI وجود دارد. برای مثال سرورهای آپاچی، مایکروسافت آی‌آی‌اس و آی‌پلنت (iPlanet) از این روش استفاده می‌کنند. تعدادی دیگر از سرورهای وب نیز از Internet Server Application Programming Interface یا ISAPI پشتیبانی می‌کنند. اگر زبان پی‌اچ‌پی در سرور وب ماژولی نداشته‌باشد، همواره می‌توان از آن به عنوان Common Gateway Interface یا CGI و FastCGI استفاده کرد. در این حالت باید سرور را تنظیم کرد تا تمامی درخواست‌های مربوط به زبان پی‌اچ‌پی را با فایل‌های CGI اجرا کند.[58]

برای نوشتن برنامه‌های دارای رابط گرافیکی نیز می‌توان از افزونهٔ PHP-GTK در زبان پی‌اچ‌پی استفاده کرد. این افزونه در نسخهٔ منتشر شده موجود نیست و باید به این زبان افزوده‌شود.[58] برای استفاده از این افزونه، نسخهٔ پی‌اچ‌پی باید بالاتر از ۵٫۱ باشد. رایج‌ترین روش برای نصب این افزونه، ترجمهٔ کد آن می‌باشد.[59]

هنگامی که از زبان پی‌اچ‌پی در محیط‌های ابری استفاده می‌شود، کیت‌های توسعه نرم‌افزار (SDK) خاصی برای استفاده از امکانات محیط نیز همراه با آن منتشر می‌گردد. برای مثال:

امنیت[edit]

۲۹٪ از مشکلات امنیتی که در ماه سپتامبر سال ۲۰۱۳ میلادی توسط پایگاه داده امنیتی ملی (National Vulnerability Database) منتشر شد، با زبان پی‌اچ‌پی مرتبط هستند.[60] این مسائل اکثراً به دلیل عدم استفاده از روش‌های مناسب توسط برنامه‌نویسان ایجاد می‌شود. این در حالی‌است که مشکلات تکنیکی که در خود زبان پی‌اچ‌پی وجود دارند، بسیار کم هستند. (۲۳ مشکل در سال ۲۰۰۸، کمتر از ۱٪ مشکلات)[61][62] با توجه به اینکه برنامه‌نویس‌ها اشتباهات بسیاری می‌کنند، بارها پیشنهاد شده‌است که قابلیت‌هایی برای تشخیص خطاهای امنیتی در زبان پی‌اچ‌پی گنجانده شود تا این خطاها را به برنامه‌نویس گزارش بدهد. با اینکه چنین ابزاری برای زبان پی‌اچ‌پی در حال توسعه است،[63] اما این پیشنهادها تا کنون رد شده و این ابزارها به زبان افزوده نشده‌اند.[64]

جستارهای وابسته[edit]

منابع[edit]

  1. Template:یادکرد
  2. 2.00 2.01 2.02 2.03 2.04 2.05 2.06 2.07 2.08 2.09 2.10 Template:یادکرد
  3. Template:یادکرد
  4. Template:یادکرد
  5. Template:یادکرد
  6. 6.0 6.1 Template:یادکرد
  7. Template:یادکرد
  8. Template:یادکرد
  9. Template:یادکرد
  10. 10.0 10.1 Template:یادکرد
  11. Template:یادکرد
  12. Template:یادکرد
  13. Template:یادکرد
  14. Template:یادکرد
  15. Template:یادکرد
  16. Template:یادکرد
  17. Template:یادکرد
  18. Template:یادکرد
  19. Template:یادکرد
  20. Template:یادکرد
  21. 21.0 21.1 21.2 21.3 21.4 Template:یادکرد
  22. 22.0 22.1 22.2 Template:یادکرد
  23. Template:یادکرد
  24. Template:یادکرد
  25. 25.0 25.1 25.2 25.3 Template:یادکرد
  26. Template:یادکرد
  27. Template:یادکرد
  28. Template:یادکرد
  29. Template:یادکرد
  30. Template:یادکرد
  31. Template:یادکرد
  32. Template:یادکرد
  33. Template:یادکرد
  34. Template:یادکرد
  35. Template:یادکرد
  36. Template:یادکرد
  37. Template:یادکرد
  38. Template:یادکرد
  39. Template:یادکرد
  40. Template:یادکرد
  41. Template:یادکرد
  42. Template:یادکرد
  43. Template:یادکرد
  44. Template:یادکرد
  45. 45.0 45.1 45.2 Template:یادکرد
  46. Template:یادکرد
  47. 47.0 47.1 Template:یادکرد
  48. Template:یادکرد
  49. Template:یادکرد
  50. Template:یادکرد
  51. Template:یادکرد
  52. Template:یادکرد
  53. Template:یادکرد
  54. Template:یادکرد
  55. Template:یادکرد
  56. Template:یادکرد
  57. Template:یادکرد
  58. 58.0 58.1 Template:یادکرد
  59. Template:یادکرد
  60. Template:یادکرد
  61. Template:یادکرد
  62. Template:یادکرد
  63. Template:یادکرد
  64. Template:یادکرد

رده:الگوهای FA

پیوند به بیرون[edit]

Template:ویکی‌انبار-رده

Template:زبان‌های برنامه‌نویسی Template:نرم‌افزار آزاد و متن‌باز Template:پی‌اچ‌پی Template:چارچوب‌های نرم‌افزاری Template:FOSS

رده:پسوند نام پرونده رده:زبان‌های اسکریپت‌نویسی رده:زبان‌های برنامه‌نویسی اسکریپتی رده:زبان‌های برنامه‌نویسی خانواده سی رده:زبان‌های برنامه‌نویسی رویه‌ای رده:زبان‌های برنامه‌نویسی زنده رده:زبان‌های برنامه‌نویسی ساخته‌شده در ۱۹۹۵ (میلادی) رده:زبان‌های برنامه‌نویسی سطح بالا رده:زبان‌های برنامه‌نویسی شیءگرا رده:زبان‌های برنامه‌نویسی کلاس محور رده:زبان‌های برنامه‌نویسی وب رده:سرنام‌ها رده:کامپایلرها و مفسرهای آزاد رده:نرم‌افزارهای چندسکویی رده:واژگان اینترنت