3 سال پیش / خواندن دقیقه

آموزش 20 نکته و ترفند کاربردی PHP (مبتدی-حرفه ای)

آموزش 20 نکته و ترفند کاربردی PHP (مبتدی-حرفه ای)

PHP مخفف بازگشتی از عبارت Hypertext Preprocessing است. مسلماً یکی از شگفت انگیزترین و قویترین زبان های برنامه نویسی در دسترس PHP می باشد. از این زبان برای نوشتن فیسبوک و وردپرس استفاده شده و همچنین میزبان بسیاری از برنامه های کاربردی قدرتمند وب است که از آنها استفاده می کنیم.

به دلیل مزایای زیاد PHP، توسعه دهندگان وب به سرعت در حال حرکت به سمت این زبان هستند. مزایای آن شامل:

  • سادگی
  • تنوع پلتفرم
  • انعطاف پذیری
  • مقیاس پذیری
  • امنیت بالا
  • متن باز بودن

به عنوان یک مبتدی ممکنه تعجب کنید:

هیچ چیز ساده و آسانی درباره PHP یا هر زبان برنامه نویسی اسکریپتی سمت سرور وجود ندارد.

شاید حق با شما باشد. زبان های برنامه نویسی اسکریپتی سمت سرور پیچیده ساخته می شوند تا وب سایت ها در برابر حملات مخرب، آسیب پذیر نباشند اما به دلیل ماهیت متن باز بودن PHP، جامعه گسترده و رو به رشدی از توسعه دهندگان وب ایجاد شده که آن را به چیزی که امروز هست تبدیل کرده است. لیستی طولانی از توابع و چارچوب هایی وجود دارد که روند کد نویسی را ساده می کنند.

تسلط بر این زبان، کلید ساخت وب سایت ها، برنامه ها و محتوای صفحه های مدرن و پویا با سرعت بیشتر و هزینه کمتر است. بنابراین اگر می خواهید یک توسعه دهنده وب خوب باشید، داشتن دانش پایه قوی از PHP مهم است.

PHP چگونه کار می کند؟

همانطور که گفته شد PHP یک زبان برنامه نویسی اسکریپتی مفسری سمت سرور است؛ مانند زبان های جاوا اسکریپت، پرل، ای اس پی، پایتون و روبی. از این زبان بیشتر برای ایجاد نرم افزارهای بک اند (Back End) استفاده می شود. هدف ما از ساخت یک صفحه وب یا رابط برنامه نویسی شده با PHP این است که آن به صورت سفارشی، پویا، تعاملی و واکنشگرا عمل کند.

گرچه همه این موارد با استفاده از زبان های اسکریپتی سمت کاربر (HTML و CSS) قابل دستیابی است اما PHP به شما امکان می دهد تا تمام لایه ها و زیربنای وب سایت خود از جمله ساختار، کاربرد، بانک اطلاعاتی، طراحی و محتوا را برنامه ریزی کنید.

آیا یادگیری PHP ارزش دارد؟

اگر اخیرا شروع به برنامه نویسی کرده باشید ممکنه چنین سؤال هایی بپرسید:

“آیا PHP کهنه شده است؟” یا “آیا PHP ارزش یادگیری را دارد؟”

آیا اینکه PHP کهنه شده یا خیر، به مسئله قابل بحثی در جامعه توسعه وب تبدیل شده است. در حقیقت حرف هایی زده میشه که اگر فیسبوک امروزه ساخته می شد، یک فناوری متفاوت آن را قدرتمندتر می کرد. دلیل اصلیش این است که زبان های ارزشمند دیگری مانند پایتون وجود دارد که رویکرد شی گرای آنها نسبت به تکرارهای رویه ای PHP برتری دارند.

اما خود مارک زاکربرگ گفته که با این وجود باز هم فیسبوک را با PHP می ساخت. تقریبا ۸۰ درصد وب سایت ها و بسیاری از برنامه های کاربردی محبوب در وب، مانند وردپرس، ویکیپدیا و وبلاگ تامبلر با پایه PHP ساخته شده اند. این بدان معناست که PHP بیشترین سهم بازار زبان های سمت سرور را در اختیار خود دارد و هنوز هم کهنه نشده است. در حقیقت، نوآوری های مداوم آن باعث شده تا به یک زمینه ارزشمند برای کارشناسان تبدیل شود.

ترفندهای مبتدی

 

۱- ویژگی گزارش خطا را فعال کنید

قبل از شروع کار بر روی یک پروژه جدید، فعال سازی ویژگی گزارش خطا از اولین کارهایی است که باید انجام دهید. حتی توسعه دهندگان حرفه ای نیز به آن قسم می خورند. این ویژگی باعث می شود که در حین زمان ساخت برنامه و در زمان بروز خطاها به جای صفحه سفید خالی، پیام خطای مفیدی را مشاهده کنید. هنگام اجرای کد به شما کمک می کند تا خطاها را حذف کنید و بازدهی را افزایش می دهد.

با قرار دادن این خط کد در فایل php.ini ویژگی گزارش خطا را فعال کنید:

diplay_errors = on

کد را بلافاصله در شروع اسکریپت قرار دهید. این کد تضمین می کند که نمایش خطاها فعال شده و از گزارش خطای مناسب استفاده می شود. می توانید یک خطا را بین هزاران خط کد تشخیص داده و زجر پیدا کردن خطا را از بین ببرید.

وقتی شروع به نوشتن کدهای پیچیده تر کنید، برای گرفتن خطاهای تجزیه و نحوی نیاز به پیاده سازی توابع پیشرفته تری خواهید داشت.

۲- با شیوه های امنیتی آشنا شوید

همه وب سایت ها و برنامه ها باید با استفاده از بهترین شیوه های امنیتی طراحی و توسعه یابند. باید دو قانون را دنبال کنید:

  • به داده های دریافت شده از جای دیگر به غیر از وب سایت یا برنامه خودتان اعتماد نکنید.
  • قبل از تصمیم برای ارسال داده به وب سایت یا برنامه دیگر داده ها را اسکیپ (Escape) کنید.

این دو قانون (FIEO) یعنی فیلتر ورودی و اسکیپ خروجی، بلوک های امنیتی وب را تشکیل می دهند. آنها از وب سایت یا برنامه شما در برابر حمله تزریق به SQL محافظت می کنند. شکست در اسکیپ داده ها می تواند منجر به نقض امنیت شود. راه های محافظتی برای مقابله با این نوع حملات عبارتند از: ۱) حذف علامت نقل قول، ۲) فرار از علامت نقل قول ، یا ۳) استفاده از یک ویژگی توکار برای محافظت در برابر علامت نقل قول.

اما این فقط یک کار سطحی است. اگر می خواهید درک عمیق تری از امنیت وب پیدا کنید، باید بدانید که این کد برای چه چیزی و چگونه کار می کند و کجای برنامه می تواند قرار گیرد:

mysql_real_escape_string ()

۳- با دستور سه گانه آشنا شوید

منطق عملگر سه گانه ارائه روشی برای کوتاه کردن بلوک های کدif-else است. از عملگرهای سه گانه به جای ساختارهای IF استفاده کنید تا کدتان بدون هیچ زحمتی، ساده و لانه ای شود. استفاده از این رابطه منطقی به شما در افزایش کارایی کد کمک می کند. کدها نه تنها کوتاه تر به نظر می رسند بلکه نگهداری آنها نیز ساده تر و سریع تر خواهد بود.

در اینجا دستور اصلیif-else آمده است:

//equivalent if-else
if($x==1)
{
if($y++2)
{
$variable = true;
}
else
{
$variable = false;
}
}
else
{
$variable = false;
}

در اینجا از رابطه منطقی عملگر سه گانه ساده استفاده شده است:

//nested ternary operator
$ variable = ($x==1) ? (($==2) ? true : false) : false;

با گسترش زبان خود علاوه بر اینکه می توانید کدهای کوتاه تری بنویسید، می توانید به سرعت پیشرفت کرده و درک بهتری از ظرافت های زبان پیدا کنید. بدین ترتیب می توانید بهینه سازی های کوچک را مانند یک حرفه ای انجام دهید.

۴- کلیات کد خود را تعیین کنید

مانند همه برنامه های نوشته شده با PHP، هدف نهایی ساخت یک رابط کاربری قابل استفاده برای کدتان است. قبل از شروع به کار و عمیق شدن در آن باید در ابتدا ساختار داده و کد خود را برنامه ریزی کنید. همچنین قبل از شروع، درباره شیوه نمایش رابط کاربری خود ایده داشته باشید. هنگام برنامه ریزی و تعیین کلیات به این موضوع فکر کنید:

“چگونه می خواهید با ماژول یا سرویس وب ارتباط برقرار کنید؟”

در اصل API یا همان رابط برنامه نویسی نرم افزار یک ارتباط شهودی و بصری بین کاربر نهایی و سرویس وب می باشد. اگر می خواهید یک ایده روشن و منسجم از هدف نهایی کد خود داشته باشید، یکی از بهترین راه حل های آن ترسیم متغیرهای کلیدی در ابتدای کار است. علاوه بر این کمک می کند تا قبل از شروع کار بر روی پلتفرم واقعی، درک کاملی از کد خود با جزئیات بیشتر داشته باشید.

“یک نکته دیگر: با آخرین اصول UX / UI (رابط کاربری / تجربه کاربر) آشنایی داشته باشید تا بتوانید به یک کد خوب طراحی شده دست یابید.”

۵- خود را به روزرسانی کنید

PHP یک زبان برنامه نویسی است که به طور گسترده استفاده می شود. این زبان هر روز به روزرسانی های جدیدی را برای تطبیق با نیازهای کاربر و ارائه سریعتر و کارآمدتر فناوری دریافت می کند. اگر می خواهید بدانید که چگونه به یک توسعه دهنده خوب PHP تبدیل شوید، الزامی است که با جدیدترین نسخه های آن آشنا شده و بهترین راه های کدنویسی سایت را پیدا کنید.

حتما از جدیدترین نسخه های نرم افزار PHP و برنامه ویرایش کد نیز استفاده کنید.

۶- زبان خود را گسترش دهید

توابع، کلاس ها، ثابت ها و رابط ها: این چهار مورد بخش عمده ای از واژگان و زبان PHP را تشکیل می دهند و کلیدهای اساسی برای بهبود کارایی و نمایش وب سایت ها، صفحات وب و برنامه ها هستند. تسلط بر این موارد، کد نویسی شما را ساده تر و برنامه را نیز بسیار جذاب می کند. نه تنها به شما کمک می کنند تا بتوانید یک کار سخت را بارها انجام دهید بلکه ویژگی های منحصر به فردی را به برنامه شما اضافه می کنند.

برای گسترش واژگان و درک بیشتر زبان، PHP.net یک دفترچه راهنمای جامع برای کمک در اختیار شما می گذارد. به طور کلی از ساختار اصلی گرفته تا پروتکل های پشتیبان، همه چیز را در بر می گیرد. همانطور که در بالا ذکر شد، واژگان خوب کلید مهارت های پیشرفته تر است. برای تقویت زبان خود به طور مرتب به دفترچه راهنما مراجعه کنید.

۷- یک فایل مستر ایجاد کنید

یکی از جنبه های اصلی ساده سازی فرایند برنامه نویسی ادغام کلیه تنظیمات ضروری در یک فایل واحد است. سپس می توانید فایل را با اسکریپت های مختلف PHP ارتباط دهید و از پراکنده شدن اتصلات داده ای جلوگیری کنید. به جای نوشتن تغییرات در چند فایل جداگانه، اکنون باید تغییرات را فقط در یک فایل واحد ایجاد کنید، به ویژه در مواردی که یک تابع جدید به چند فایل اضافه می شود.

۸- توضیحات و مستندات

بسیاری از توسعه دهندگان تازه کار بر این باورند که توضیحات باید از حداقل دغدغه های آنها باشد. اما حقیقت این است که نوشتن توضیحات عادت خوبی است که باید هر چه زودتر آن را به دست آورید. در زمان کدنویسی برای نوشتن توضیحات باید به اندازه نوشتن کد حساسیت و مراقبت داشته باشید. توضیحات داخل کد به شما در یادآوری مفهوم قسمت های مختلف کد به عنوان یک مرجع کمک خواهند کرد.

اگر نمی خواهید نظم کدتان با نوشتن توضیحات به هم بخورد، فقط کافی است چند یادداشت کوتاه برای بهبود خوانایی کد ایجاد کنید.

گزینه دیگر، مستندسازی کد برای بخش های پیچیده است به گونه ای که وقتی دوباره آن بخش را مرور می کنید، بتوانید به سرعت پیچیده ترین جزئیات را به یاد بیاورید. فراموش نکنید که با تغییر کد توضیحات را نیز تغییر دهید. phpDocumentor و Doxygen ابزارهای مفیدی برای خواندن توضیحات و تولید صفحات مستند قابل استفاده است.

Stfalcon.com یک راهنمای گام به گام درباره شیوه مستند سازی و نوشتن توضیحات در کد برنامه ارائه می دهد.

۹- از یک چارچوب PHP استفاده کنید

فریم ورک یا چارچوب PHP برای آسان تر کردن کار توسعه دهندگان طراحی شده است. خیلی قبلتر یا حتی اگر هنوز هم به صورت طبیعی کدنویسی می کنید، می دانید که ایجاد یک برنامه وب از ابتدا، هفته ها تا ماه ها طول می کشد. بخش اعظم آن تولید کد تکراری است. هیچ ضرری ندارد به جز این که وقت و تلاش زیادی می طلبد.

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

بهترین چارچوب های PHP مواردی مانند: پشتیبانی از پایگاه داده، راهنمای کاربری آسان و یک مجموعه مفید و قوی را فراهم می کنند. بنابراین هنگام انتخاب یک چارچوب، حتما همه این خصوصیات ها را در نظر داشته باشد.

۱۰- استفاده از برنامه نویسی شی گرا (OOP)

برنامه نویسی شی گرا (OOP) چیزی است که هر توسعه دهنده PHP باید با آن آشنا باشد. برنامه نویسی شی گرا کمک می کند تا از نوشتن کد تکراری راحت شوید و اجازه می دهد تا کد به صورت کارآمد اجرا شود. علاوه بر این در ساخت برنامه های پیچیده و قابل استفاده مجدد نیز کمک می کند، در غیر این صورت و در روش رویه ای به زمان و تلاش بسیار زیادی نیاز دارید. در اینجا مفاهیم برنامه نویسی شی گرا در PHP آورده شده است:

  • کلاس
  • وراثت
  • اینترفیس یا رابط
  • اشیاء
  • انتزاع

به طور کلی برنامه نویسی شی گرا تعداد مراحل کدنویسی و اجرای آن را کاهش می دهد. با پیشرفت مهارت های خود یاد می گیرید که هم برنامه های شی گرا و هم رویه ای را کدنویسی و تست کنید و آنها را به طور یکپارچه در یک برنامه کامل جمع کنید.

چارچوب های PHP که برای مبتدیان مناسب است

 

آموزش 20 نکته و ترفند کاربردی PHP (مبتدی-حرفه ای)

ترفندهای حرفه ای

۱- از برگه تقلب برای SQL Injection استفاده کنید

هر توسعه دهنده وب باید به خوبی با شیوه های امنیتی آشنا باشد و باید برنامه ها را با این شیوه های امنیتی درون ذهنش طراحی کند. قانون اولیه این است که هرگز به داده های دریافت شده از جای دیگر اعتماد نکنید. قانون دیگر اسکیپ (escape) داده ها قبل از ارسال به جای دیگری است. ترکیب این دو قانون برای ایجاد اصول امنیتی پایه می تواند بدین صورت ساده شوند: فیلتر ورودی، اسکیپ خروجی (FIEO).

علت اصلی حمله تزریق به پایگاه داده، اسکیپ کردن داده های خروجی است. به خصوص وقتی رخ می دهد که وجه تمایز بین قالب پرس و جو SQL و داده های استفاده شده توسط پرس و جو به دقت حفظ نمی شود. این حمله در برنامه های PHP که پرس و جوها با روش زیر ساخته می شوند، رایج است:

<?php

$query = “SELECT *

FROM users

WHERE name = ‘{$_GET[‘name’]}'”;

?>

در این حالت مقدار متغیر

$_GET[‘name’]

توسط کاربر، منبعی دیگر، تعیین می شود که نه فیلتر شده و نه اسکیپ.

اسکیپ شدن داده ها باعث می شود تا قالب اصلی آنها در یک متن جدید حفظ شود. تأکید بر اسکیپ داده های خروجی تذکری است برای اینکه در خارج از برنامه باید داده ها اسکیپ شده استفاده شوند چراکه در غیر این صورت ممکن است به صورت اشتباه تفسیر شوند. در مقابل آن فیلتر کردن داده ها این اطمینان را به ما می دهد که داده ها قبل از استفاده اعتبارسنجی شده اند. تأکید بر فیلتر ورودی بیانگر این است که منبع داده های خارج از برنامه باید فیلتر شود زیرا نمی توان به آنها اعتماد کرد.

با فرض اینکه از MySQL استفاده می کنیم، می توان آسیب پذیری حمله تزریق به SQL را با اسکیپ اسم توسط تابع ()mysql_real_escape_string کاهش داد. حتی اگر اسم فیلتر هم شود یک لایه امنیتی بیشتری به وجود می آید. (اجرای چندین لایه امنیتی ” دفاع در عمق” نامیده می شود و یک روش امنیتی بسیار خوب است.) در مثال زیر برای افرایش شفافیت کد از قراردادهای نامگذاری استفاده شده و در آن فیلتر ورودی و اسکیپ خروجی داده ها نشان داده می شود:

<?php

// Initialize arrays for filtered and escaped data, respectively.

$clean = array();

$sql = array();

// Filter the name. (For simplicity, we require alphabetic names.)

if (ctype_alpha($_GET[‘name’])) {

$clean[‘name’] = $_GET[‘name’];

} else {

// The name is invalid. Do something here.

}

// Escape the name.

$sql[‘name’] = mysql_real_escape_string($clean[‘name’]);

// Construct the query.

$query = “SELECT *

FROM users

WHERE name = ‘{$sql[‘name’]}'”;

?>

گرچه استفاده از قراردادهای نامگذاری حتی با وجود اینکه چیزی فیلتر شده یا نه و یا اسکیپ شده یا نه، می تواند به شما کمک کند اما استفاده از عبارت های آماده، روش بسیار بهتری است. خوشبختانه با استفاده از PDO توسعه دهندگان PHP یک API جهانی برای دسترسی به داده ها دارند که از عبارت های آماده پشتیبانی می کند حتی اگر پایگاه داده اصولی نباشد.

به یاد داشته باشید آسیب پذیری های حمله تزریق به SQL زمانی وجود دارد که تمایز بین قالب یک پرس و جو SQL و داده های استفاده شده توسط آن پرس و جو به دقت حفظ نشود. با استفاده از عبارت های آماده می توانید این مسئولیت را با ایجاد قالب پرس و جو و داده در مراحل جداگانه به سمت بانک اطلاعاتی هل دهید:

<?php

// Provide the query format.

$query = $db->prepare(‘SELECT *

FROM users

WHERE name = :name’);

// Provide the query data and execute the query.

$query->execute(array(‘name’ => $clean[‘name’]));

?>

صفحه http://php.net/pdo اطلاعات و نمونه های بیشتری را ارائه می دهد. عبارت های آماده قوی ترین موارد حفاظتی را برای مقابله با حمله تزریق به SQL پیشنهاد می دهند.

۲- تفاوت بین عملگرهای مقایسه ای را بشناسید

این نکته خوبی است اما مثال عملی برای آن وجود ندارد تا نشان دهد چه زمانی یک مقایسه غیر دقیق می تواند مشکلاتی ایجاد کند.

اگر ازتابع ()strpos برای تعیین وجود یک زیر رشته در یک رشته استفاده می کنید نتایج می تواند گمراه کننده باشد: (تابع ()strpos در صورت عدم یافتن زیر رشته مقدار FALSE برمی گرداند)

<?php

$authors = ‘Chris & Sean’;

if (strpos($authors, ‘Chris’)) {

echo ‘Chris is an author.’;

} else {

echo ‘Chris is not an author.’;

}

?>

در مثال بالا از آنجا که زیر رشتهChris در همان ابتدای رشته Chris & Sean قرار دارد، تابع ()strpos مقدار صحیح ۰ را برمیگرداند و این مقدار نشان دهنده موقعیت شروع زیررشته در رشته است. از آنجا که نتیجه عبارت شرطی به صورت مقدار بولین تعیین می شود، مقدار صحیح ۰ به عنوان FALSE ارزیابی شده و شرط شکست می خورد. به عبارت دیگر به جای رشته ‘Chris is an author.’ رشته ‘Chris is not an author.’ چاپ می شود!

این مثال را می توان با یک مقایسه دقیق اصلاح کرد:

<?php

if (strpos($authors, ‘Chris’) !== FALSE) {

echo ‘Chris is an author.’;

} else {

echo ‘Chris is not an author.’;

}

?>

۳- میانبر Else

این نکته را می توان در یک تمرین مفید به طور اتفاقی کشف کرد. بدین صورت که همیشه قبل از استفاده از متغیرها آنهارا مقداردهی اولیه کنید. عبارت شرطی را در نظر بگیرید که تعیین می کند که آیا کاربر بر اساس نام کاربری اش admin است:

<?php

if (auth($username) == ‘admin’) {

$admin = TRUE;

} else {

$admin = FALSE;

}

?>

این مثال درست به نظر می رسد چون درک آن در یک نگاه آسان است. مثال را با کمی جزئیات بیشتر تصور کنید، متغیرهایی نیز برای نام و ایمیل تعیین می شود:

<?php

if (auth($username) == ‘admin’) {

$name = ‘Administrator’;

$email = ‘[email protected]’;

$admin = TRUE;

} else {

/* Get the name and email from the database. */

$query = $db->prepare(‘SELECT name, email

FROM users

WHERE username = :username’);

$query->execute(array(‘username’ => $clean[‘username’]));

$result = $query->fetch(PDO::FETCH_ASSOC);

$name = $result[‘name’];

$email = $result[’email’];

$admin = FALSE;

}

?>

از آنجا که متغیر admin$ همیشه به طور صریح یا با مقادیر TRUE یا FALSE مقداردهی می شود، همه چیز خوب است. اما اگر بعداً توسعه دهنده یک elseif اضافه کند، می تواند فرصتی به وجود آید که مقداردهی متغیر فراموش شود:

<?php

if (auth($username) == ‘admin’) {

$name = ‘Administrator’;

$email = ‘[email protected]’;

$admin = TRUE;

} elseif (auth($username) == ‘mod’) {

$name = ‘Moderator’;

$email = ‘[email protected]’;

$moderator = TRUE;

} else {

/* Get the name and email. */

$query = $db->prepare(‘SELECT name, email

FROM users

WHERE username = :username’);

$query->execute(array(‘username’ => $clean[‘username’]));

$result = $query->fetch(PDO::FETCH_ASSOC);

$name = $result[‘name’];

$email = $result[’email’];

$admin = FALSE;

$moderator = FALSE;

}

?>

اگر کاربر نام کاربری را وارد کند که شرط elseif برقرار شود، متغیر admin$ مقداردهی نمی شود و می تواند منجر به یک رفتار ناخواسته یا حتی بدتر از آن آسیب پذیری امنیتی شود. علاوه بر این، اکنون وضعیتی مشابه برای متغیر moderator$ نیز وجود دارد که در اولین شرط if مقداردهی نمی شود.

با مقداردهی اولیه متغیرهای admin$ و moderator$ می توانید به راحتی از کل این سناریو جلوگیری کنید:

<?php

$admin = FALSE;

$moderator = FALSE;

if (auth($username) == ‘admin’) {

$name = ‘Administrator’;

$email = ‘[email protected]’;

$admin = TRUE;

} elseif (auth($username) == ‘mod’) {

$name = ‘Moderator’;

$email = ‘[email protected]’;

$moderator = TRUE;

} else {

/* Get the name and email. */

$query = $db->prepare(‘SELECT name, email

FROM users

WHERE username = :username’);

$query->execute(array(‘username’ => $clean[‘username’]));

$result = $query->fetch(PDO::FETCH_ASSOC);

$name = $result[‘name’];

$email = $result[’email’];

}

?>

صرف نظر از اینکه بقیه کد چه کاری انجام می دهد، مقدار متغیر admin$ با مقدار FALSE مشخص شده مگر اینکه صریحاً روی مقدار دیگری تنظیم شود و همین مطلب برای متغیر moderator$ نیز برقرار است. ضد خطا بودن، رویکرد امنیتی خوب دیگری است که در آن وجود دارد. بدترین چیزی که در نتیجه عدم تغییر متغیرهای admin$ یا moderator$ در هر یک از شرط ها می تواند اتفاق بیفتد این است که با متغیرهای moderator یا moderator به درستی رفتار نشود.

اگر به دنبال ایجاد میانبرید اما کمی ناامید هستید که مثال ما شامل else دیگری باشد، نکته ای داریم که ممکنه آن را دوست داشته باشید. مطمئن نیستیم که می تونه میانبر حساب شود اما با این وجود امیدواریم که مفید باشد.

تابعی را در نظر بگیرید که تعیین می کند آیا کاربر مجاز به مشاهده صفحه خاصی است:

<?php

function authorized($username, $page) {

if (!isBlacklisted($username)) {

if (isAdmin($username)) {

return TRUE;

} elseif (isAllowed($username, $page)) {

return TRUE;

} else {

return FALSE;

}

} else {

return FALSE;

}

}

?>

در واقع این مثال بسیار ساده است زیرا فقط سه قانون در نظر گرفته شده: دسترسی مدیران همیشه مجاز استن و افرادی که در لیست سیاه قرار دارند هرگز اجازه دسترسی ندارند. تابع ()isAllowed تعیین می کند که آیا شخص دیگری به آن دسترسی داشته باشد یا خیر. برای عبارت های شرطی از توابع استفاده می کنیم تا کد را ساده نگه داریم و روی ساختار منطقی متمرکز شویم.

روش های مختلفی برای بهبود این مثال وجود دارد. اگر بخواهید تعداد خطوط کد را کاهش دهید، یک شرط ترکیبی می تواند به شما کمک کند:

<?php

function authorized($username, $page) {

if (!isBlacklisted($username)) {

if (isAdmin($username) || isAllowed($username, $page)) {

return TRUE;

} else {

return FALSE;

}

} else {

return FALSE;

}

}

?>

در حقیقت می توانید کل تابع را به یک شرط واحد ترکیبی کاهش دهید:

<?php

function authorized($username, $page) {

if (!isBlacklisted($username) && (isAdmin($username) || isAllowed($username, $page)) {

return TRUE;

} else {

return FALSE;

}

}

?>

در نتیجه این کد می تواند تعداد returnها را به یکی کاهش دهد:

<?php

function authorized($username, $page) {

return (!isBlacklisted($username) && (isAdmin($username) || isAllowed($username, $page));

}

?>

اگر هدفتان کاهش تعداد خطوط کد است، کارتان تمام شده است. با این حال توجه داشته باشید که از توابع ()isBlacklisted () ، isAdmin و ()isAllowed در عبارت های شرطی استفاده کرده ایم. براساس چیزی که در تعیین نتیجه این توابع درگیر هستند، کاهش همه شرط ها به یک شرط پیچیده ممکن است چندان جذاب نباشد.

نکته مورد نظر ما در اینجا خود را نشان می دهد. اگر هر تابع یکreturn داشته باشد بنابراین می توان این قوانین را خیلی ساده نوشت:

<?php

function authorized($username, $page) {

if (isBlacklisted($username)) {

return FALSE;

}

if (isAdmin($username)) {

return TRUE;

}

return isAllowed($username, $page);

}

?>

از خطوط کد بیشتری استفاده می کند اما بسیار ساده و بی تاثیر است. مهمتر از همه این راه حل میزان محتوایی که باید با آن در ارتباط باشید را کاهش می دهد. به عنوان مثال، به محض اینکه مشخص شد که کاربر در لیست سیاه قرار دارد می توانید با خیال راحت آن را فراموش کنید. این امر به ویژه هنگامی که عبارات منطقی پیچیده تر شوند، بسیار مفید است.

۴- براکت ها را حذف کنید

منظور از “براکت ها” همان “آکولادها” هستند نه “براکت های مربعی”.

این نکته را باید بی هیچ قید و شرطی نادیده بگیرید. زیرا بدون آکولادها، خوانایی و تفکیک پذیری کد آسیب می بیند. مثال ساده زیر را در نظر بگیرید:

<?php

if (date(‘d M’) == ’21 May’)

$birthdays = array(‘Al Franken’,

‘Chris Shiflett’,

‘Chris Wallace’,

‘Lawrence Tureaud’);

?>

<?php

if (date(‘d M’) == ’21 May’)

$birthdays = array(‘Al Franken’,

‘Chris Shiflett’,

‘Chris Wallace’,

‘Lawrence Tureaud’);

party(TRUE);

?>

برای شناخت اینکه چه زمانی می توان آکولادها را حذف کرد، به مثال کوتاه زیر نگاه کنید:

<?php

if ($gollum == ‘halfling’) $height –;

else $height ++;

?>

از آنجا که برای هر شرط تنها یک خط کد وجود دارد، ممکنه اشتباه کمتری اتفاق بیفتد اما این مسئله منجر به مشکل دیگری می شود: ناسازگاری ها. این ناسازگاری ها اثرات نامطلوبی دارند و زمان بیشتری را برای خواندن و درک کد می برند. سازگاری خصوصیت ارزشمندی است که توسعه دهندگان معمولاً حتی اگر استاندارد کد نویسی را دوست نداشته باشند از استاندارد کدنویسی پیروی می کنند. توصیه می کنیم همیشه از آکولادها استفاده کنید:

<?php

if (date(‘d M’) == ’21 May’) {

$birthdays = array(‘Al Franken’,

‘Chris Shiflett’,

‘Chris Wallace’,

‘Lawrence Tureaud’);

party(TRUE);

}

?>

 

۵- به ()Str_replace بیشتر از ()Ereg_replace و ()Preg_replace توجه کنید

تیتر این نکته برداشت اشتباهی را نشان می دهد و منجر به همان کاربرد غلطی می شود که سعی در جلوگیری از آن دارید. این حقیقت واضحی است که توابع رشته ای در تطابق رشته سریعتر از توابع عبارت های منظم هستند:

اگر از عبارت های منظم استفاده می کنید، ()ereg_replace و ()preg_replace خیلی سریع تر از ()str_replace هستند.

از آنجا که ()str_replace از تطبیق الگو پشتیبانی نمی کند، این تابع بی معنی است. انتخاب بین توابع رشته ای و توابع عبارت های منظم بستگی به این دارد که برای هدف مناسب باشند نه برای سرعت بیشتر. اگر نیاز به تطبیق الگو دارید از تابع عبارت های منظم استفاده کنید و اگر نیاز به تطبیق یک رشته دارید از یک تابع رشته ای استفاده کنید.

۶- از عملگر سه گانه استفاده کنید

مزیت عملگرهای سه گانه قابل بحث است (به هر حال تنها یک عملگر سه گانه وجود دارد). در اینجا یک خط کد با یک بررسی دقیق وجود دارد:

<?php

$host = strlen($host) > 0 ? $host : htmlentities($host);

?>

اوه! در حقیقت مفهوم مثال بالا این است؛ اگر طول رشته $host بزرگتر از صفر باشد، رشته اسکیپ می شود اما در عوض به طور تصادفی مخالف آن عمل می کند. اشتباه کردن آسونه ؟ شاید. در حین بررسی کد اشتباه کردن آسونه؟ قطعا. کوتاه کردن کد لزوما آن را بهتر نمی کند.

عملگر سه گانه ممکن است برای تک خطی ها، نمونه های اولیه و الگوها خوب باشد اما به شدت اعتقاد داریم که تقریباً همیشه یک عبارت شرطی معمولی بهتر است. PHP مقایسه ای و طولانی است و فکر می کنیم کد نیز باید اینطور باشد.

۷- Memcached

دسترسی به دیسک و دسترسی به شبکه کند است و معمولا بانک اطلاعاتی از هر دو استفاده می کند.

حافظه سریع است و می توان با استفاده از یک حافظه پنهان محلی از سرریز شدن شبکه و دسترسی به دیسک جلوگیری شود. این حقایق گفته شده را با هم تلفیق کنید تا متوجه مفهوم Memcached (مِمکَشد) شوید، ممکشد یک”سیستم حافظه ذخیره موقت شی در سرورهای توزیع شده” است که در ابتدا برای پلتفرم وبلاگ نویسی LiveJournal مبتنی بر Perl ساخته شده بود. برای انجام عملیات کش روی سرورهای وب سایت ها استفاده می شود.

اگر برنامه تان روی سرورهای مختلف توزیع نشده، احتمالاً نیازی به Memcached ندارید. روش های ساده تر ذخیره سازی – برای مثال سریال کردن داده ها و ذخیره آن در فایل موقت – می توانند کارهای اضافی زیادی را در هر درخواست حذف کنند. در واقع زمانیکه به مشتریان در تنظیم برنامه هایشان کمک می کنیم، این سیستم می تواند دسترسی آسان به سرورها را فراهم کند.

یکی از ساده ترین و عمومی ترین راه های ذخیره داده در حافظه استفاده از برنامه های حافظه اشتراکی کمکی در APC است. سیستم حافظه پنهانی که در اصل توسط جورج شولشناگل ساخته شده است. مثال زیر را در نظر بگیرید:

<?php

$feed = apc_fetch(‘news’);

if ($feed === FALSE) {

$feed = file_get_contents(‘http://example.org/news.xml’);

// Store this data in shared memory for five minutes.

apc_store(‘news’, $feed, 300);

}

// Do something with $feed.

?>

برای هر درخواست با استفاده از این نوع حافظه پنهان نیازی به انتظار برای سرور راه دور روی ارسال اطلاعات فید ندارید. برخی تأخیرها باعث خسارت و ضرر می شوند – در این مثال تا حدود پنج دقیقه تأخیر وجود دارد – اما این سیستم می تواند این تأخیرها را به زمان واقعی مورد نیاز برنامه شما نزدیک کند.

۸- از عملگر @ به کنترل به درستی استفاده کنید

همیشه سعی کنید از کاربرد عملگر توقیف خطا خودداری کنید. اگر می خواهید کدی بنویسید که در ذهن کارایی داشته باشد، عملگر @ نسبتاً کند است و می تواند هزینه بر باشد.

توقیف خطا کند است. به این دلیل که PHP به صورت پویا قبل از اجرای عبارت توقیف، گزارش خطا را به ۰ تغییر می دهد و سپس بلافاصله این تغییر را برمیگرداند و این هزینه بر است.

بدتر از همه اینکه استفاده از عملگر توقیف خطا، ردیابی علت اصلی خطا را دشوار می کند. مثال زیر خطایی را نشان می دهد که در آن متغیر albert$ به روش ارجاع تخصیص داده شده در حالیکه معلوم نیست آیا متغیر albus$ مقداردهی شده یا نه:

<?php

$albert =& $albus;

?>

این کد نمونه خوبی برای نشان دادن خطاها است. به دلیل اینکه متغیر albert$ به روش ارجاع به متغیر albus$ تعیین می شود و در نتیجه تغییرات بعدی در albus$ در albert$ نیز اتفاق می افتد.

راه حل بسیار بهتر استفاده از تابع ()isset است:

<?php

if (!isset($albus)) {

$albert = NULL;

}

?>

تخصیص مقدار NULL به متغیر albert$ به این معنا است که albert$ به مرجعی اشاره می کند که وجود ندارد اما این تخصیص صریح تا حد زیادی وضوح کد را بهبود می بخشد و از رابطه ارجاعی بین دو متغیر جلوگیری می کند.

اگر کدی را از جایی گرفته اید و در آن بیش از حد از عملگر توقیف خطا استفاده شده است، نکته کمکی و مفیدی به شما معرفی می کنیم. یک افزونه جدید از کتابخانه افزونه های PHP به نام Scream وجود دارد که توقیف خطا را غیرفعال می کند.

۹- به جای ()Strlen از ()Isset استفاده کنید

این نکته در واقع یک ترفند فوق العاده است:

<?php

if (isset($username[5])) {

// The username is at least six characters long.

}

?>

از آنجا که رشته ها مانند یک آرایه رفتار می کنند، هر کاراکتر در رشته مانند یک عنصر در آرایه است. با تعیین اینکه آیا یک عنصر خاص در رشته وجود دارد می توانید تعیین کنید که رشته حداقل آن طول از تعداد کاراکترها را دارد. (توجه داشته باشید که کاراکتر اول، عنصر با اندیس ۰ است در نتیجه متغیر

$username[5]

ششمین کاراکتر در رشته username$ است.)

از ()isset استفاده می شود چون از ()strlen سریعتر است. به بیان ساده ()strlen یک تابع پیچیده و ()isset یک ساختار زبانی است و به طور کلی فراخوانی یک تابع هزینه بیشتری نسبت به استفاده از یک ساختار زبانی دارد.

شاید از نوشته‌های زیر خوشتان بیاید
نظر خود را درباره این پست بنویسید ...

منوی سریع