۴۴ نکتهی طلایی در PHP
۱۴ خرداد ۱۳۹۰ ساعت ۰۵:۵۴
پی اچ پی
یه مشت حرف به دردبخور
من صندوقچهی فهموشعور PHPی خودم رو تکوندم یه سری نکته ازش ریخت بیرون. نکاتی که برای پیدا کردن بعضیهاش باید اینترنت رو زیر و رو کنیم یا نکاتی سادهای که ازشون خبر نداشتیم. خیلی سعی کردم هر چی به ذهنم میرسه لیست کنم. یه لیست ۴۴تایی شد که ممکنه بعدا باز هم بهش اضافه کنم.!
مقاله برای سطح دانش خاصی نیست. از نکات خیلی ساده و ابتدایی درش هست تا نمونههای تخصصی.
۱- استفادهی صحیح از توابع Checking
وقتی میخوایم وجود یا عدم وجود متغیر یا محتوا رو چک کنیم باید رفتار توابع و عملگرها رو بدونیم. سه مدل کلی برای چک کردن داریم: تابع empty، تابع isset و مدل boolean.
تابع isset فقط وقتی مقدار FALSE برمیگردونه که متغیر وجود نداشته باشه یا مقدارش برابر null باشه. پس برای چک کردن محتوا گزینهی جالبی نیست. بیشترین کاربرد این تابع میتونه برای چک کردن آرایهها باشه:
if(isset($_GET['AHHP'])) {
echo 'yes';
}
$name = isset($_POST['Boplo.ir']) ? 'YES' : 'NO';
اگر آرایه رو قبل از استفاده چک نکنیم با خطای E_STRICT (یا E_WARNING؟) مواجه میشیم. برای چک کردن یک کلید میشه از تابع array_key_exists هم استفاده کرد.تعداد پارامترهای تابع isset نامشخص هست و میشه همزمان چند تا متغیر رو چک کرد. در این حالت دو تا خط زیر یکسان هستند:
$existence = isset($a, $b, $c); $existence = isset($a) && isset($b) && isset($c);
مدل boolean حالتی هست که معمولا در IF استفاده میشه مثل حالت زیر
if( $name ) echo $name;در این مدل متغیر با FALSE و TRUE چک میشه و ما باید دقیقا بدونیم که یک متغیر چه مواقعی در برابر این آزمون FALSE یا TRUE میده!
در برابر این نوع چک، همیشه مقدار TRUE برمیگرده غیر از موارد زیر:
// String $str = ""; // Integer $int = 0; // Float $float = 0.0; // Array $arr = array(); // NULL $var = null; // Boolean $bool = false;متغیرهایی که تعریف نشده باشند هم NULL در نظر گرفته میشند.
اشیاء فقط زمانی TRUE هستند که حداقل یک مشخصه (Property) داشته باشند حتی با مقدار NULL.
class Test1 {
public function func1(){ }
public function func2(){ }
public function func3(){ }
}
$obj = new Test1;
if( !$obj ) {
echo 'You will see this message!';
}
$obj->name = 'Amir Hossein';
if( !$obj ) {
echo 'You will NOT see this message!';
}
class Test2 {
public $name = null;
}
$obj = new Test2;
if( !$obj ) {
echo 'You will NOT see this message!';
}
توابع هم مقدار برگشتیشون چک میشه یا یکی از مدلهای بالاست یا هیچی نیست (void) که این حالت هم NULL در نظر گفته میشه.تابع empty هم معکوس مدل boolean عمل میکنه.
در سایت PHP.net یک جدول خیلی کامل در این رابطه وجود داره که میتونه مفید باشه: Types Comparisons Table
یک نکتهی جانبی. گاهی لازمه که یک متغیر رو ابتدا به Boolean تبدیل کنیم و بعد چکش کنیم. برای این کار سه روش وجود داره:
$str = 'Boplo.ir'; $bool1 = (bool) $str; $bool2 = setType($str, 'bool'); $bool3 = !!$str;خداییش هیچ جای وب همچین مطلب کاملی در این رابطه پیدا نمیکردی! باز برو بگو Boplo.ir خوب نیست!
۲- تگ بستهی PHP
استفاده از تگ بستهی PHP اجباری نیست ولی وقتی استفاده شه همهی محتویات بعد از این تگ به عنوان محتویات HTML به بافر فرستاده میشه و چاپ میشه! حتی اگر یک خط خالی یا یک Space باشه. پس برای اسکریپتهای PHP که کاملا حاوی کدهای PHP هستند بهتره از این تگ استفاده نشه.
۳− استفاده از توابع Native بجای توابع شخصی
خیلی از توابع PHP توابع سادهای هستند که میشه خودمون بسازیمشون. این کار در سه حالت اتفاق میافته:
- برنامهنویس گرامی از وجود تابع خبر نداره و خودش مینویسدش یا کدهایی مینویسه که همون کار رو میکنه.
- برنامهنویس نیاز داره رفتار تابع رو تغییر بده.
- برنامهنویس مریضه!
۴- استفاده از توابع بجای کدهای تکراری
توابع پردازش میشند. همیشه بهتره بجای کدهای تکراری موجود در اسکریپت از توابع استفاده کنیم. یعنی کدهای تکرار شونده رو بصورت یک تابع تعریف کنیم و تابع رو فراخوانی کنیم. سرعت اجرای اسکریپت افزایش پیدا میکنه.
۵- آزادسازی حافظه
متغیرهای حجیم مثل آرایههای بزرگ، رشتههای طولانی، اشیاء بزرگ، کانکشنها یا Resourceهای بیاستفاده رو در اولین فرصت توسط تابع unset یا برابر مقدار NULL قرار دادن حذف کنیم تا به حافظهی درگیر سرور فشار کمتری بیاد.
وقتی با رشتههای بزرگی سر و کار داریم روش بهینه و سریع، تابع tmpfile است. این تابع هم سریع عمل میکنه هم راندمان بالایی داره و هم کار باهاش سادست. میتونیم اطلاعات رو به این فایل موقتی منتقل کنیم و حافظه رو آزاد کنیم و در موقع مناسب اطلاعات رو از این فایل بیرون بکشیم.
فایلهای ساخته شده با اتمام اسکریپت حذف میشند.
$temp = tmpfile(); fwrite($temp, "writing to tempfile"); fseek($temp, 0); echo fread($temp, 1024); fclose($temp); // this removes the file // output: writing to tempfile
۶- استفاده از === بجای ==
عملگر «==» برابری دو مقدار رو بررسی میکنه و عملگر «===» علاوه بر برابری، نوع دادهها رو هم بررسی میکنه. استفاده از «===» احتمال خطا رو در برنامه کاهش میده.
1 == '1' // TRUE 1 === '1' // FALSE "" == 0 // TRUE "" === 0 // FALSE
۷- تعیین مقدار پیشفرض
همیشه برای متغیرها و پارامترها مقدار اولیه تعیین کنیم. (منظور از پارامتر، متغیرهایی است که با ورودیها ارتباط دارند و از مقدارشون مطمئن نیستیم)
$total = 0; foreach($costs as $cost) $total += $cost; $name = isset($_GET['name']) ? $_GET['name'] : '';
۸- Return بجای Echo
تا جایی که امکان داره داخل اسکریپتهای تو در تو بجای echo از return استفاده کنیم. این کار باعث میشه تا کنترل بهتری روی خروجیهامون داشته باشیم.
// a.php $name = 'Amir Hossein'; return $name; // b.php $site = 'Boplo.ir'; $name = include './a.php'; return ($name.' : '.$site); // c.php $data = include './b.php'; echo $data;البته باید توجه داشت که این کار برای دادهها حجیم توصیه نمیشه!
۹- مدل شرطی :?
در نسخهی جدید PHP میشه این نوع سینتکس رو بدون مقدار TRUE بکار برد یعنی دو خط زیر یکسان هستند:
$name = isset($_GET['name']) ? $_GET['name'] : 'Amir Hossein'; $name = $_GET['name'] ?: 'Amir Hossein';
۱۰- کوچکی و بزرگی حروف در PHP
در PHP نام متغیرها و مشخصهها (Propertyها) به کوچکی و بزرگی حساسه (Case-Senstive). نام توابع، کلاسها و متدها نیست!
۱۱- AJAX دمپایی نیست که همیشه ازش استفاده کنیم!
در این پست باید و نبایدهایی از AJAX گفته شده: باید و نبایدهای استفاده از AJAX
۱۲- تابع strtotime
تابع strtotime خیلی هیجان انگیزه. بهش تاریخ بصورت String میدیم و Timestamp دریافت میکنیم:
echo strtotime("12 May 2011"); // 1305172800
echo date('F', strtotime("2011/10/15")); // October
باحالی بیشتر اینه که میشه تاریخ رو کم و زیاد کرد:
echo date('d', strtotime("2011/10/15 +2 days")); // 17
echo date('d', strtotime("2011/10/15 -2 days")); // 13
echo date('F', strtotime("2011 oct 15 +1 month")); // November
۱۳- تعیین موقعیت جغرافیایی پیشفرض برای توابع زمان
توسط تابع date_default_timezone_set میشه چنین کاری کرد. کافیه شناسه موقعیت مورد نظرمون رو بدیم تا زمانها رو اون تنظیم شه. برای ایران هست: Asia/Tehran
نمونهی استفاده از این تابع. مثلا سرور ما در انگلستان قرار گرفته (سهساعتونیم از تهران عقب است) و الان در تهران ساعت ۴:۳۰ بعد از ظهر است:
echo date('H:i'); // 13:05
date_default_timezone_set('Asia/Tehran');
echo date('H:i'); // 16:05کافیه این تابع رو ابتدای اسکریپتهامون فراخوانی کنیم تا همهی زمانها یکسان شه.
۱۴- تبدیل تاریخ شمسی به میلادی و بالعکس
کلاسی آماده شده برای بدستگیری این کار به همراه توابع پرکاربرد زمان برای تقوبم شمسی: مبدل شمسی توابع زمان در PHP
۱۵- توابع implode و explode
این توابع خیلی کاربردی هستند. تابع implode یک آرایه میگیره با یک String. اون مقدار رشتهای رو بین عناصر آرایه قرار میده و یک رشته برمیگردونه.
$arr = array(1, 4, 5, 10);
echo implode(' - ', $arr); // 1 – 4 – 5 – 10
$arr = array(1, 4, 5, 10);
echo '('. implode('),(', $arr) .')'; // (1),(4),(5),(10)
$arr = array(1, 4, 5, 10);
echo implode(', ', $arr); // 1, 4, 5, 10تابع join همون تابع implode است.
تابع explode دقیقا برعکس عمل میکنه یعنی یک رشته میگیره و براساس یک رشته دیگه به آرایه تبدیل میکنه
$str = 'Amir, Hossein, Boplo';
$arr = explode(', ', $str); // array('Amir','Hossein','Boplo')
$date = date('Y/m/d'); // 2011/10/15
$arr = explode('/', $date); // array(2011,10,15)
۱۶- تابع current
تابع current عنصری از آرایه که Pointer روش قرار داره رو میده. استفادهای که من ازش میکنم معمولا گرفتن اولین عنصر یک آرایهی Associative هست که کلیدش رو نمیدونم.
$arr = array( 'name' => 'Amir Hossein', 'website' => 'Boplo.ir' ); echo current($arr); // Amir Hosseinمشابه چنین کاری میشه توسط تابع each هم انجام داد ولی باید دقت بشه که تابع current کاری به Pointer آرایه نداره ولی each محل Pointer رو تغییر میده:
$arr = array(4, 5, 6); echo current($arr); // 4 echo current($arr); // 4 echo current($arr); // 4 $arr = array(4, 5, 6); $info = each($arr); echo $info['value']; // 4 $info = each($arr); echo $info['value']; // 5 $info = each($arr); echo $info['value']; // 6
۱۷- تابع list
توضیح تابع list یکم سخته ولی واقعا مفیده. این تابع یک سری متغیر به عنوان پارامتر میگیره و وقتی برابر یک آرایه قرار میگیره، عناصر آرایه رو به ترتیب داخل پارامترهای خودش میریزه. با مثال توضیح میدم. حالت زیر رو در نظر بگیر:
$arr = array( 'Amir Hossein', 'Boplo.ir'); $name = $arr[0]; $website = $arr[1];این کار رو توسط تابع list اینجوری انجام میدیم:
$arr = array( 'Amir Hossein', 'Boplo.ir'); list($name, $website) = $arr;یا مثلا
$date = date('y-m-d');
list($year, $month, $day) = explode('-', $date);حتی میشه پارامترهایی که نمیخوایم رو هم تعیین نکنیم:
$date = date('y/m/d');
list($year, , $day) = explode('/', $date);
۱۸- تابع in_array
تابع in_array مورد علاقهی منه (کلا آرایه رو خیلی دوست دارم). با این تابع میتونیم چک کنیم که یک مقدار در یک آرایه وجود داره یا خی
$arr = array(1, 2, 3, 'Boplo.ir');
if( in_array('Boplo.ir', $arr) ) {
echo 'Hooray';
}مدل دیگهای استفادهاش حالت زیر هست. دو خط زیر یکسان هستند:
$bool = $age==10 || $age==15 || $age==18; $bool = in_array($age, array(10, 15, 18));
۱۹- توابع بررسی ساختار متغیرها و Debugging
تابع print_r اجزای یک آرایه یا شیء رو نمایش میده
$arr = array('name'=>'AHHP', 'age'=>24);
echo '<pre>';
print_r($arr);
/* Output
Array
(
[name] => AHHP
[age] => 24
)
*/همونجور که میبینی این تابع مقدار خروجی رو به بافر میفرسته. اگر بخوایم این مقدار رو return کنه کافیه پارامتر دوم رو برابر TRUE قرار بدیم:
$arr = array('name'=>AHHP, 'age'=>24);
echo '<pre>' . print_r($arr, true) . '</pre>';
تابع گرامی بعدی var_dump هست. این تابع مثل print_r عمل میکنه ولی نه فقط برای آرایهها و اشیاء بلکه هر نوع مقداری رو نمایش میده، نوع مقادیر رو هم اضافه میکنه. تعداد پارامترهای این تابع نامشخص هست و خروجی رو همیشه مستقیما به بافر میفرسته.
echo '<pre>';
$arr = array('name'=>'AHHP', 'age'=>24);
var_dump('Boplo', 0, false, null, $arr);
/* Output
string(5) "Boplo"
int(0)
bool(false)
NULL
array(2) {
["name"]=>
string(4) "AHHP"
["age"]=>
int(24)
}
*/وقتی توی کدنویسی دچار مشکل میشیم که چرا برنامه کار نمیکنه یا غلط کار میکنه این تابع معجزه میکنه میتونیم مقادیر رو چک کنیم و ببنیم کجای کار دچار مشکل شدیم.در این رابطه، تابع دیگهای داریم به نام var_export که مثل print_r عمل میکنه با این تفاوت که خروجی به سینتکس PHP هست یعنی میشه خروجیش رو در اسکریپت کپی کنیم:
$arr = array('name'=>'AHHP', 'age'=>24);
echo '<pre>' . var_export($arr, true) . '</pre>';
/* Output
array (
'name' => 'AHHP',
'age' => 24'
)
*/
۲۰- تابع array_sum
تابع array_sum از اون توابعی هست که خیلیها نمیشناسنش و بجاش کد و حلقه مینویسند. این تابع یک آرایه میگیره و مقادیرش رو با هم جمع میکنه.
$arr = array(1, 2, 3, 4, 5); echo array_sum($arr); // 15با این تابع میشه یک تابع Average سبک و ساده برای PHP نوشت:
/**
* Average
* Author AHHP ~ Boplo.ir
* On Khordad 90
*
* @return mixed The average of parameters
*/
function average() {
$args = func_get_args();
if($args)
return array_sum($args)/count($args);
return 0;
}
echo average(1, 2, 3, 4, 5); // 3
۲۱- پارامتر دوم trim
تابع trim فاصله و فضاهای خالی اول و آخر یک String رو حذف میکنه و برای تمیز کردن متنهای ورودی خیلی مفیده. توسط پارامتر دوم این تابع میشه کاراکترهای بیشتری رو تعریف کرد. مثلا همهی نقطههای موجود در اول و آخر متن. با فارسی هم مشکل نداره.
echo trim(' AHHP', 'P'); // "AHH"
توابع ltrim و rtrim هم وجود داره که به ترتیب فاصلههای خالی اول متن (L = Left) و آخر متن (R = Right) رو حذف میکنه.یک نکتهی مهم:
if( trim('0') ) // FALSE
if( trim('0') !== '') // TRUE
۲۲- توابع Data Filtering
اکستنشن Filter توابعی برای چک کردن رشتههای پرکاربرد داره. مثلا آدرس ایمیل یا URI بهش میدیم و مشخص میکنه که مقدار معتبر هست یا خیر (Validation) و یا کاراکترهای نامعتبر رو حذف میکنه(Sanitization).
if(filter_var('chert o pert', FILTER_VALIDATE_EMAIL) === false) {
echo "آدم باش ایمیل درست وارد کن";
} else {
echo "عجب آدرس ایمیل جالبی";
}تابع filter_var میاد چک میکنه آیا آرایههای GET و POST اینا یک مقدار (کلید) خاص رو دارند یا خیر:
if( filter_has_var(INPUT_POST, 'test') ) {
echo $_POST['test'];
}همونجور که میبینی اینجوری چک کردن به هیچ درد نمیخوره اما نکتهی خفن این تابع اینه که فقط وقتی TRUE برمیگردونه که مقدار از HTTP اومده باشه نه در اسکریپت!به بیان سادهتر میشه باهاش چک کرد که فلان GET یا POST در اسکریپت مقدار داده شده یا از HTTP اومده:
$_POST['test'] = 'Boplo.ir';
if(filter_has_var(INPUT_POST, 'test')) {
echo $_POST['test'];
}در این حالت هیچی چاپ نخواهد شد!اکستنشن filter در PHP5 نصب هست.
۲۳- بررسی Query String و URL
در این پست تابع parse_url معرفی و بررسی شده: parse_url یا باحالی یک تابع
۲۴- Serialize و Unserialize
این دو تا تابع رو خیلیها نمیشناسند. تابع Serialize یک آرایه یا شیء رو به String تبدیل میکنه! برای مواقعی کاربرد داره بخوایم مثلا یک آرایه رو در فایل یا دیتابیس ذخیره کنیم. تابع Unserialize هم String تولید شدهی تابع Serialize رو به آرایه یا شیء تبدیل میکنه.
$arr = array('name'=>'AHHP', 'age'=>24);
$string = serialize($arr);
//a:2:{s:4:"name";s:4:"AHHP";s:3:"age";i:24;}
$arr2 = unserialize($string);
echo $arr2['name']; // AHHPدقت کن که محتویات یک شیء داینامیک هست و استفاده از این توابع برای اشیاء توصیه نمیشه مگه اینکه شیء استاتیک باشه.نکته اینکه میشه رفتار این دو تا تابع رو بر حسب نیاز تغییر داد.
نکتهی دیگه اینکه برای ذخیرهی یک آرایه یا شیء استاتیک در فایل یا دیتابیس روشهای بهتری هم وجود داره مثل var_export یا JSON.
۲۵- تابع number_format
تابع number_format اعداد رو پردازش میکنه و به بصورت خوانا برای نمایش تبدیل میکنه.
پارامتر اول این تابع یک عدده. پارامتر دوم تعداد اعشار هست که میخوایم داشته باشیم. پارامتر سوم کاراکتری هست که برای اعشار استفاده میشه مثلا نقطه یا ممیز و پارامتر آخر هم کاراکتری هست برای جدا کردن سهرقمسهرقم میخوایم استفاده کنیم.
$num = 9123989.865 echo number_format($num, 1, '/', ' '); // 9 123 989/8 echo number_format($num, 3, '', ''); // 9123989865 echo number_format($num); // 9,123,989 echo '$' . number_format($num, 2) // $9,123,989.86
۲۶- Escape توسط تابع intval
گاهی مطمئنیم که یک مقدار باید Integer باشه. تابع intval میاد از اولین کاراکتر شروع میکنه عدد جدا میکنه تا به غیرعددی برسه. اگر پارامتر با عدد شروع نشده باشه یا هیچ عددی توش نباشه مقدار صفر برمیگردونه.
var_dump(intval('56aa'), intval('aa71'), intval('56/32'));
/* Output
int(56)
int(0)
int(56)
*/از این تابع میشه برای جلوگیری از SQL Injection وقتی ورودی عدد هست استفاده کنیم
$sql = "SELECT * FROM `tbl` WHERE id=".intval($_GET['id']); $select = mysql_query($sql);تابعی به نام floatval هم داریم که مشابه این تابعست ولی مقدار Float برمیگردونه.
۲۷- تابع کوتاهسازی متن
تابعی با نام summarize در این پست معرفی شده: تابع کوتاه سازی متن
۲۸- ساختن شیء بدون کلاس
گاهی شاید لازم داشته باشیم که یک Object داشته باشیم و بهش مشخصه (Property) بدیم و شبیه آرایه ازش استفاده کنیم. برای چنین کاری کافیه از کلاسی به نام stdClass نمونهگیری کنیم.
$obj = new stdClass; $obj->name = 'Amir Hossein'; $obj->site = 'Boplo.ir'; $users = new stdClass; $users->user = new stdClass; $users->user->name = 'AHHP';
۲۹- Chain در PHP
Chain متدها حالتی هست که بشه توابع یک شیء رو پشت سر هم استفاده کرد. نمونهی این کار رو در کتابخانههای جاوااسکریپت مثل MooTools و jQuery زیاد میبینیم ولی در PHP چندان مرسوم نیست. یک نمونه از Chain:
$obj->func1()->func2($var)->func3()->func4();این خط مثل کد زیر میمونه:
$obj->func1(); $obj->func2($var); $obj->func3(); $obj->func4();برای ایجاد امکان چنین کاری کافیه متدهای کلاس مقدار this$ رو return کنند. همین!
class test {
public function func1(){
// do something
return $this;
}
public function func2(){
// do something
return $this;
}
public function func3(){
// do something
return $this;
}
public function func4($name){
// do something
return $name;
}
}
$obj = new test;
$name = $obj->func1()
->func2()
->func3()
->func4('Boplo');این روش هیچ حسن یا عیب خاصی نداره فقط تعداد کاراکترهای استفاده شده در اسکریپت رو کم میکنه. IDEها هم نمیتونند متدها و کلاسهای نوشته شده به این شکل رو درست تشخیص بدند.
۳۰- استفاده از مشخصهها با نامهای غیرمعتبر.
گاهی اتفاق میافته که در شرایط خاص نام مشخصهی یک شیء نام غیرمعتبری داره و نمیشه در این حالت از آکولاد استفاده میشه:
// Propery name: first-name
$obj->first-name ; // ERROR
$obj->{'first-name'}; // Correctاین حالت در مواقعی پیش میاد که توابعی از دادههای آزادی مثل آرایهها شیء میسازند. یا مثلا اکستنشن SimpleXML از نام تگها استفاده میکنه و این حالت رو بوجود میاره.
۳۱- تکثیر اشیاء
در PHP4 وقتی یک شیء رو داخل یک متغیر میریختیم اون شیء کپی میشد ولی در PHP5 اینکار فقط یک مرجع (Reference) برای شیء تولید میکنه
// PHP 4
clsss Test {
var $name = 'AHHP';
}
$a = new Test;
$b = $a;
$b->name = 'A';
$c = & $a;
$c->name = 'H';
echo $a->name; // H
echo $b->name; // A
echo $c->name; // Hهمونطور که واضحه وقتی a$ برابر b$ قرار گرفت کاملا یک نمونهی جدید ایجاد شد که ربطی به هم نداشتند و برای ایجاد مرجع باید از & استفاده میکردیم. اما در PHP5:
// PHP 5
clsss Test {
public $name = 'AHHP';
}
$a = new Test;
$b = $a;
$b->name = 'A';
$c = clone $a;
$c->name = 'H';
echo $a->name; // A
echo $b->name; // A
echo $c->name; // Hحالا a$ و b$ یکی هستند و برای کپی از clone استفاده کردیم و c$ شد کپی از a$ نه مرجعش.
۳۲- توابع Closure در PHP
در نسخههای جدید PHP توابع Closure اضافه شدند. نمونهی این نوع توابع رو در زبانهایی مثل JavaScript زیاد میبینیم.
نمونه با و بدون استفاده از Closure:
// Without Closure
function cube($n) {
return($n*$n*$n);
}
$a = array(1, 2, 3, 4, 5);
$b = array_map("cube", $a);
// $b = array(1, 8, 27, 64, 125);
// With Closure
$a = array(1, 2, 3, 4, 5);
$b = array_map(function($n) {
return($n*$n*$n);
}, $a);
// $b = array(1, 8, 27, 64, 125);
۳۳- دسترسی شیگرا به دیتابیس توسط PDO
افزونهی PDO بطور مفصل در این پست معرفی شده: PDO چیست؟
۳۴- الگوی MVC به اپلیکیشن ساختار میده
الگوی MVC در این پست اختصارا معرفی شده: MVC چیست؟
۳۵- پردازش سادهی XML توسط SimpleXML
این اکستنشن خیلی معروف شده ولی شاید نشناسیش. خصوصیت ویژهاش اینه که کار باهاش فوقالعاده سادست.
$xmlStr = <<<XML <?xml version='1.0'?> <boplo> <author>Amir Hossein</author> <nickname>AHHP</nickname> <blogs> <blog>Boplo.ir</blog> <blog>AHHP.ir</blog> <blog>Boplo.org</blog> </blogs> </boplo> XML; $xml = new SimpleXMLElement($xmlStr); echo $xml->author; // Amir Hossein echo $xml->nickname; // AHHP echo $xml->blogs->blog[0]; // Boplo.ir foreach($xml->blogs->blog as $blog) echo $blog; unset($xml, $xmlStr);
۳۶- JSON عزیز کلید بسیاری از مشکلاته
اگر نمیشناسیش به شدت پیشنهاد میشه با هم آشنا شید: JSON و JSONP
۳۷- BBCODE در PHP
آقا من دیدم یه سری میخواند به کاربراشون امکان استفاده از تگهای HTML رو بدند و کلی دنگ و فنگ میکشند. یک اکستنشن در PHP وجود داره به نام BBCODE. وقتی نصبش کنیم میتونیم امکان پردازش تگهای BBCODE رو به کاربر بدیم. این روش هم خیلی ساده و آمادست و هم امنیتش بیشتر از HTML هست. پس دفعهی دیگه دور خودمون نچرخیم.
۳۸- حذف ایمیل از Gmail در IMAP
وقتی با IMAP به Gmail وصل میشیم میتونیم یک فولدر رو بررسی کنیم یا همهی ایمیلها رو با عنوان All Mail.
نکته اینجاست که برای حذف یک ایمیل نمیشه از All Mail استفاده کرد. ابتدا باید ایمیل رو در یک فولدر پیدا کرد، توسط توابع imap_delete و imap_expunge از فولدر خارجش کرد
.
این کار ایمیل رو به فولدر Trash منتقل میکنه. باید به Trash وصل شیم و مرحلهی قبل رو تکرار کنیم تا ایمیل کاملا حذف شه.
$mailbox = "{imap.gmail.com:993/imap/ssl}INBOX";
$inbox = imap_open($mailbox, 'me@gmail.com', '******');
$msgno = 210; // msgno in INBOX
imap_delete($inbox, $msgno);
imap_expunge($inbox);
imap_close($inbox);
$mailbox = "{imap.gmail.com:993/imap/ssl}Trash";
$trash = imap_open($mailbox, 'me@gmail.com', '******');
$msgno = 15; // msgno in Trash
imap_delete($trash, $msgno);
imap_expunge($trash);
imap_close($trash);عملیات حذف فقط در فولدرهای Trash و Spam منجر به حذف کامل ایمیل میشه در بقیه فولدرها، ایمیل رو به Trash منتقل میکنه و در All Mail هم هیچ کاری نمیکنه.
۳۹- ارسال ایملیهای حرفهای به سادگی زیاد
کلاس PHPMailer رو من خیلی دوست دارم. همیشه هرکس میخواد ایمیل بفرسته بهش پیشنهاد میکنم. یک مثال ساده ازش اینجا میذارم که با هم لذت ببریم:
include '/path/to/class.phpmailer.php';
$mailer = new PHPMailer;
$mailer->CharSet = 'UTF-8';
$mailer->From = 'sender@domain.com';
$mailer->Subject = 'This is Subject';
$mailer->Body = 'This is main body. usually HTML';
$mailer->AltBody = 'This is alternative body.';
$mailer->AltBody .= 'usually plain text';
$mailer->IsHTML(true); // Body is HTML
$mailer->AddAddress('receiver@domain.com', 'Mr. Receiver');
$mailer->AddAddress('receiver2@domain.com', 'Ms. Receiver');
$mailer->AddCC('cc@domain.com', 'Mr. CC');
$mailer->AddBCC('bcc@domain.com', 'Mr. BCC');
if($mailer->Send()){
echo 'Email sent successfully!';
} else {
echo 'Email sending failed!';
}
۴۰- خواندن و نوشتن در فایل دیگر سخت نیست
PHP دو تابع واقعا به اصطلاح Handy برای خواندن و نوشتن محتوا در فایل داره.
تابع file_get_contents آدرس یک فایل رو به عنوان پارامتر اول میگیره و محتویات فایل رو برمیگردونه. بدون درد، بدون خونریزی (سرپایی)
$data = file_get_contents('../test.txt');
$data = file_get_contents('/home/user/dir1/boplo.ir');این تابع پارامترهای دیگهای هم داره!تابع file_put_contents برای نوشتن اطلاعات ساخته شده. آدرس فایل و محتویات میگیره و فایل رو پر میکنه:
$data = $some_string_or_data; $path = '/home/user/dir1/boplo.ir.txt'; file_put_contents($path, $data);به همین راحتی! اگر فایل وجود نداشته باشه و مجوزش ساختنش باشه، ساخته میشه. همچنین دقت کن که این تابع در این حالت، محتویات قبلی فایل رو حذف میکنه.
میشه به راحتی مشخص کرد که فایل موجود overwrite نشه و آپدیت بشه یعنی محتویات جدید به آخر محتویات فعلی فایل اضافه بشه بجای اینکه اونها رو پاک کنه. توسط پارامتر سوم:
$data = $additonal_string_or_data; $path = '/home/user/dir1/boplo.ir.txt'; file_put_contents($path, $data, FILE_APPEND);
۴۱- امکان دریافت غیرمستقیم فایل توسط کاربر
تابع readfile محتویات یک فایل رو میخونه و به بافر میفرسته اگر Header رو برای داونلود تعیین کنیم، کاربر فایل رو داونلود خواهد کرد. در این روش چون ما محتویات یک فایل رو خوندیم و به بافر فرستادیم دیگه کاربر از محل اصلی فایل مطلع نمیشه. مثل وقتی که بخوای از همین سایت فایلی داونلود کنی. نمونهی استفاده از مثالهای سایت PHP.net:
$file = './music.mp3';
header('Content-Description: File Transfer');
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename='.basename($file));
header('Content-Transfer-Encoding: binary');
header('Expires: 0');
header('Cache-Control: must-revalidate, post-check=0, pre-check=0');
header('Pragma: public');
header('Content-Length: ' . filesize($file));
ob_clean();
flush();
readfile($file);
exit;خیلی از سایتها به این روش علاقمندند تا اجازه ندند کاربر فایلها رو از مسیر اصلی دریافت کنه. باید دقت بشه که اولا در این روش محتویات فایل در RAM قرار میگیره و بعد به بافر میره یعنی برای فایلهای حجیم یا درخواستهای زیاد اصلا مناسب نیست! همچنین امکان ادامهی داونلود یا Resume هم به کاربر نمیده!برای حل این دو تا مشکل روشهای دیگهای باید استفاده بشه.
۴۲- پیدا کردن آسان فایلها توسط تابع جادویی glob
احتمالا میدونی که پیدا کردن یک فایل چه کار زشت و مزخرفیه اما تابع glob خیلی باحاله. یک Pattern میگیره و آرایه حاوی نام فایلهای پیدا شده میده:
$cssFiles = glob('./static/css/*.css');
foreach($cssFiles as $file) {
echo $file;
}
$images = glob({./images/*.jpg,./icons/*.gif,./icons/*.png}, GLOB_BRACE);
۴۳- تشخیص نوع و MIME فایلها
در این پست تابعی معرفی شده که برای تشخیص فرمت فایل خیلی خوب میتونه عمل کنه: گرفتن MIME پسوندهای معروف
۴۴- ثابتهای جادویی PHP
در PHP یک سری ثابت وجود داره که برای شناسایی موقعیت کدها خیلی مفیده. مثل __FILE__ که آدرس فایلی که در حال اجراست رو میده یا __LINE__ برای شمارهی خط در حال اجرا و غیره.
لیست این ثابتهای در این صفحه قرار گرفته: Magic constants.
فعالیت یک سری از این ثابتها رو میشه با توابع هم شبیهسازی کرد.
function test(){
echo 'Function: ' . __FUNCTION__;
echo '<br />';
echo 'Line: ' . __LINE__;
}
test();
/* Output
Function: test
Line: 4
*/
حرف آخر
من خودم تا حالا همچین مقالهای ندیدم نه فارسی و نه انگلیسی و کلی هم براش زحمت کشیدم پس لطفا اگر جایی نقل قول میفرمایید لینک به این صفحه رو هم بذارید.
اینکه توی همهی مثالها اسم مبارکم رو بردم واسه جلوگیری از یه سری کارهای زشته.
من این مقاله رو تا یک جایی با یک عناوینی نوشتم ولی متاسفانه کلا از دستش دادم و مجددا شروع کردم به تالیف و تایپ یعنی خیلی واسش زحمت کشیده شده. امیدوارم هرکی که این مقاله رو بدون لینک منبع کپی میکنه یا از لینکهای نامرئی اینا استفاده میکنه، بجای سوسک به پادری تبدیل شه که همه بیان لهش کنن و خاک کفششون رو باهاش بگیرن.
بنده بیماری روانی ندارم که ساعت چهار صبح مقاله تایپ کنم. دوست داشتم تجربیاتم رو باهات Share کنم همونطور که خیلیها تجربیاتشون رو با من Share کردم و دزدی مطلب، خود خود شخص شخیص نامردی محسوب میشه!
بگذریم. اینا اون نکاتی بود که من باهاش برخورد داشتم و دوست داشتم تو هم بدونی. برای پیدا کردن تعدادیشون وقت و هزینهی زیادی صرف شده!
امیدوارم حداقل یکی از این نکات واست مفید واقع شه.
شنگول و منگول باشی
امیرحسین



تو چی فکر می کنی؟