با سلام، چندی پیش دوره ی رایگان برنامه نویسی شیء گرای PHP به اتمام رسید و بر اساس قولی که به شما داده بودیم با سری آموزش PDO (مخفف PHP Data Object - به معنی شیء داده ی PHP) به صورت کامل در خدمت شما هستیم. قبل از شروع ذکر این نکته الزامی است:
این دوره برای افراد مبتدی در نظر گرفته نشده است. برای استفاده ی واقعی از مطالب این دوره علاوه بر آشنایی قبلی با مباحث پایگاه داده (مانند MySQL) باید آشنایی کلی با مباحث برنامه نویسی شیء گرای PHP نیز داشته باشید.
سوالی که اکثر توسعه دهندگان هنگام برخورد با تکنولوژی های جدید میپرسند این است که "چرا باید از فلان تکنولوژی استفاده کنم؟" یا "چرا سختی یادگیری فلان تکنولوژی را تحمل کنم و روش خودم را تغییر دهم؟" این سوالات نه تنها سوالات بدی نیستند بلکه سوالات بسیار خوبی محسوب می شوند. پرسش گری هنگام مواجهه با هر موردی در برنامه نویسی از بهترین عادات برنامه نویسان خوب است. من سعی می کنم با ذکر چند مورد به این سوالات جواب بدهم:
همه ی ما می دانیم که در سال های اخیر PHP با سرعت قابل توجهی در حال پیشرفت و به روز رسانی بوده است. معمولا هنگامی که چنین اتفاقی در یک زبان برنامه نویسی می افتد، محدودیت های آن زبان برنامه نویسی افزایش پیدا می کند تا علاوه بر امنیت، به توسعه دهندگان کمک کند تا بتوانند برنامه های سطح بالا و حرفه ای بنویسند.
زمانی که بحث به PHP می رسد، می گوییم PHP بهتر یعنی PHP شیء گرا.
یعنی هر چه بیشتر از اشیاء استفاده کنید، کد های مرتب تر و با قابلیت تست آسان تر دارید. اولین قدم برای برنامه نویسی شیء گرا در سمت پایگاه داده استفاده از رابط PDO است.
انتزاعی بودن یا استفاده ی PDO از یک لایه ی انتزاعی در تصویر زیر به خوبی دیده می شود:
اگر به تصویر توجه کنید متوجه می شوید که PDO از یک لایه ی انتزاعی برای دسترسی به پایگاه های داده استفاده می کند. چرا می گوییم انتزاعی؟ به این دلیل که این لایه برای ما قابل مشاهده نیست. به عبارت دیگر PDO می تواند با پایگاه های داده ی بسیاری ارتباط برقرار کند اما mysqli نمی تواند چنین کاری کند و فقط مخصوص MySQL است. احتمالا این دو جمله را برای کار با PDO دیده اید:
وقتی می گوییم PDO یک لایه ی دسترسی به داده ی انتزاعی (data-access abstraction layer) دارد، یعنی لایه ای که مسئول ارتباط با پایگاه های داده است، انتزاعی است و مخصوص یک نوع پایگاه داده ی خاص نیست. این بدان معنی است که PDO از شما پارامتر هایی ثابت را می گیرد (مثلا نام پایگاه داده، آدرس سرور و ...) و با همین پارامتر ها و یک دستور واحد می تواند به پایگاه های داده ی بسیاری متصل شود.
از طرفی زمانی که می گوییم PDO پایگاه داده را انتزاعی نمی داند (database abstraction) یعنی با اینکه می تواند با یک دستور به پایگاه های داده ی مختلف متصل شود و از لحاظ اتصال به پایگاه داده انتزاعی است، اما برای کار با پایگاه داده (مثلا نوشتن query ها یا SQL statement ها) هیچ لایه ی انتزاعی ندارد. بنابراین باید query های مخصوص هر پایگاه داده را با زبان خودش بنویسید.
فرض کنید کارفرما از شما پروژه ای خواسته است و شما این پروژه را با MySQL و به بهترین شکل و فرم نوشته اید. حالا چند وقت گذشته است و کارفرما به شما می گوید به هر دلیلی مدیران شرکت تصمیم گرفته اند که پروژه باید با PostgreSQL پیاده سازی شود. در چنین حالتی می خواهید چه کار کنید؟
بهترین کاری که می توانید انجام دهید جایگذاری های پی در پی و شلخته و شلوغ است، مانند تبدیل mysqli_connect به pg_connect. همچنین باید تمامی توابعی را که برای اجرای query ها و دریافت داده نوشته اید را تصحیح یا بازنویسی کنید و این داستان حالا حالا ها تمام شدنی نبود اما اگر از PDO استفاده کرده بودید کافی بود چند پارامتر را در فایل configuration تغییر دهید!
نکته: شما هنوز هم مجبور خواهید بود که query های MySQL را به query های PostgreSQL تبدیل کنید. در بعضی از وب سایت ها به اشتباه نوشته شده است که اگر از PDO استفاده کنید همه چیز خود به خود و به طور جادویی کار می کند! خیر، مزیت استفاده از PDO این است که به جز بازنویسی query ها نیازی به تغییر زیادی در سورس کد خود نخواهید داشت.
قابلیت parameter binding (به معنی متصل کردن پارامتر ها) به شما اجازه می دهد تا به جای placeholder ها در query خود، مقادیر متغیر ها را قرار دهید. اگر بخواهم به زبان ساده تر بگویم، می گویم به جای نوشتن query کامل در سورس کد، می توانید قسمت هایی از آن را با placeholder (به معنی جا گیرنده) ها پر کنید.
در واقع placeholder ها همانطور که از نامشان مشخص است جای متغیری را نگه می دارند تا بعدا متغیر آن جا بنشیند و خودشان مقدار خاصی ندارند. به طور مثال همه ی ما با سوالات جا خالی در مدرسه آشنا هستیم. آن چند نقطه ای که به عنوان جا خالی می گذاشتند نوعی placeholder برای جواب ما بود.
دو دلیل عمده برای استفاده از پارامتر های متصل (bind parameters) وجود دارد:
اگر از ORM هایی مثل Doctrine استفاده کرده باشید می دانید قابلیت ارائه ی داده در جدول ها به صورت یک شیء چقدر اهمیت دارد. اگر دوست دارید از این قابلیت استفاده کنید اما دوست ندارید به سراغ یادگیری ORM بروید، استفاده از PDO این قابلیت را به شما می دهد.
رابط mysql از PHP7 حذف شده است! بنابراین اگر بخواهید از PHP7 استفاده کنید (که حتما پیشنهاد می کنم چنین کاری را انجام دهید) باید تمامی دستورات mysql
را به mysqli
تغییر دهید. بنابراین حالا که قرار است از mysql مهاجرت کنید چرا مستقیما به PDO مهاجرت نکنید؟ اگر قرار باشد در کشور دیگری زندگی کنید و قصد دارید از خانه ی خود دور شوید، چرا کشور ثروتمند و مرفه ای را انتخاب نکنید و به سیبری بروی!؟
همچنین بر اساس روند پیشرفت زبان PHP احتمال اینکه mysqli هم از بین برود غیر ممکن نیست و حتی اگر این اتفاق نیوفتند، مطمئن باشید که در آینده اکثر کارفرمایان از شما درخواست استفاده از رابط های شیء گرا را خواهند داشت.
امیدوارم این دلایل مختصر و کوتاه شما را متقاعد کرده باشد که از PDO استفاده کنید. البته یادتان نرود که این مزایا مخصوص رابط PDO بود و تمام مزایای کلی برنامه نویسی شیء گرا (مانند کیفیت بالای کد، تمیز بودن کد، نظم بالا، کاهش حجم کد و زحمت برنامه نویس، مدیریت آسان تر کد، تست بهتر کد و ...) نیز بر آن اطلاق می شود.
برای کار با PHP به طور کلی به یک وب سرور نیاز است. مشکل اینجاست که ما تنها قصد تمرین داشته و پرداخت هزینه ی یک وب سرور برای تمرین عاقلانه نیست. پیشنهاد من به شما استفاده از نرم افزار های رایگانی مانند WAMP است. این نرم افزار ها محیط یک وب سرور را روی ویندوز شما شبیه سازی می کنند و به نوعی یک سرور محلی را روی سیستم خود خواهید داشت.
این قسمت اول از سری آموزشی اتصال شیء گرا به پایگاه داده است. در این قسمت سعی کرده ایم به دلایل مهاجرت به رابط PDO بپردازیم و آن ها را به شکل فنی توضیح دهیم. در قسمت های آینده به سراغ مباحث عملی و کدنویسی PDO خواهیم رفت.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.
در این قسمت، به پرسشهای تخصصی شما دربارهی محتوای مقاله پاسخ داده نمیشود. سوالات خود را اینجا بپرسید.