Boplo.ir
rss

من در Facebook


جستجو


آخرین مطالب

مطالب همینجوری

بر و بچ

MyView TakhteShasi Tween

دوستشون دارم

بیلبورد

دامین برای فروش: CleanCode.ir
FastFeed.ir
Fonvi.com

تماس


انواع و اقسام سفارشات طراحی و برنامه نویسی سایت پذیرفته میشه. از سایت حمایت از خرگوشهای صورتی گرفته تا سایت قاچاق اعضای بدن!
تماس

 

از بيماران سرطاني حمايت كنيم

A new begining
AHHP presents

 

آدرس کوتاه: http://Boplo.ir/:122

۴۴ نکته‌ی طلایی در 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 توابع ساده‌ای هستند که میشه خودمون بسازیمشون. این کار در سه حالت اتفاق میافته:

  • برنامه‌نویس گرامی از وجود تابع خبر نداره و خودش مینویسدش یا کدهایی مینویسه که همون کار رو میکنه.
  • برنامه‌نویس نیاز داره رفتار تابع رو تغییر بده.
  • برنامه‌نویس مریضه!
برای حالات اول و سوم کاری نمیشه کرد. برای حالت دوم باید در نظر بگیریم که توابع PHP کامپایل شده هستند ولی کدهای ما باید کامپایل بشند پس قطعا توابع خود 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 کردم و دزدی مطلب، خود خود شخص شخیص نامردی محسوب میشه!

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

شنگول و منگول باشی
امیرحسین

 

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


حمید : مطالب خیلی قشنگی بود
واقعاً دستت درد نکنه
(11 ماه و 18 روز و 20 ساعت و 14 دقیقه پیش)

Hesam : ممنون
(11 ماه و 18 روز و 18 ساعت و 30 دقیقه پیش)

حسن : چی بگم جز این که بابا خیلی کارت درسته!
همه شو تا ته خوندم و کلی چیز یاد گرفتم!
یه نکته ای اضافه کنم؛ راجع به BBCode گفتی، BackPress را که دیدی، یه کتابخونه توپ واسه تعریف و بعد parse این ها داره. در واقع همون توابع add_shortcode و do_shortcode وردپرس هست.
راستی یه چیز دیگه، از Ext JS استفاده می کنی؟ خریدی یا؟ چطوریاست؟
(11 ماه و 18 روز و 17 ساعت و 34 دقیقه پیش)

امیرحسین : ممنون از الطاف دوستان گراااام.
بهونه‌ی Ext JS واسه من MODX بوده که اونم خودش Open Source هست. واسه پروژه‌های شخصی من Ext JS رو نمی‌پسندم. به نظر بار سنگینی و شلوغیش بیشتر از امکاناتشه. یه پروژه باید خیلی بزرگ و پیچیده باشه تا امکانات Ext JS کاربرد پیدا کنه. برای پروژه‌های معمولی گزینه‌های دیگه‌ای هم برای ساختن UI وجود داره.
(11 ماه و 18 روز و 16 ساعت و 46 دقیقه پیش)

پیام : سلام امیر جان
عالی بود
همچین مطالبی اونم فارسی خیلی کم پیدا میشه
امیدوارم که موفق باشی ;)
(11 ماه و 18 روز و 15 ساعت و 14 دقیقه پیش)

امید : آقا دستت درد نکنه. کلی چیز جدید یاد گرفتم خدا خیرت بده.
(11 ماه و 18 روز و 12 ساعت و 1 دقیقه پیش)

علی رضا : خب خدا رو شکر یکی دو تا نکته‌اش جدید بود و استفاده کردم و جالب بود برام این درصد بالای تجربیات مشترک :)
(11 ماه و 17 روز و 21 ساعت و 15 دقیقه پیش)

احد : آقا خیلی حال کردم و چیزهای جدیدی یاد گرفتم از همه بهترش پیدا کردن آسان فایلها توسط تابع جادویی glob بود
خسته نباشی .
(11 ماه و 17 روز و 19 ساعت و 50 دقیقه پیش)

مرتضی : خیلی عالی بود
(11 ماه و 17 روز و 18 ساعت و 48 دقیقه پیش)

یک دوست : بسیار ممنون.
مقاله فوق العاده کاربردی و مفیدی بود.
خیر ببینی
(11 ماه و 17 روز و 16 ساعت و 55 دقیقه پیش)

امیر سروری : ممنون از مطلب بسیار مفیدتون . مطمئنا وقت زیادی براش صرف شده و بسیار با ارزشه . لطفا به کارتون ادامه بدید .
(11 ماه و 17 روز و 13 ساعت و 28 دقیقه پیش)

محمد حسین : سلام امیرحسین
دستت درد نکنه حال دادی
(11 ماه و 17 روز و 3 ساعت و 40 دقیقه پیش)

3pehr : با تشکر از وقتی که برای نوشتن این مقاله گذاشتید به شخصه از خیلی از مواردش استفاده کردم.
در مورد شماره ۳۲: اسم مصطلح این توابع anonymous function یا closures میباشد که احتمالا منظور شما کلمه دوم بوده .
(11 ماه و 16 روز و 16 ساعت و 43 دقیقه پیش)

امیرحسین : ممنون لطف و تذکر شما.
اصلاح شد.
(11 ماه و 16 روز و 16 ساعت و 27 دقیقه پیش)

سعید : بسیار عالی بود و واقعا جای تشکر داره. مطلب شما رو شیر کردم و امیدوارم این مطلب انگیزه ای باشه بره اشتراک گزاری هرچه بیشتر
(11 ماه و 16 روز و 13 ساعت و 42 دقیقه پیش)

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

راستی این کد امنیتی خیلی چیز مزخرفیه !
(11 ماه و 15 روز و 19 ساعت و 59 دقیقه پیش)

یک دوست : واقعا عالي بود كلي از مشكلات منو حل كردي
ممنون
(11 ماه و 15 روز و 6 ساعت و 9 دقیقه پیش)

K@M@L : سلام

واقعا دست گلت درد نکنه! برای من یکی که خیلی مفید بود..

بازم از این Share ها انجام بده..!
(11 ماه و 14 روز و 7 ساعت و 11 دقیقه پیش)

ali : خدا خیرت بده
خیلی خوب بود!
(11 ماه و 13 روز و 7 ساعت و 49 دقیقه پیش)

امیر : ممنون از مطلب مفیدتون
من تازه کار با php رو شروع کردم میخواستم ببینم که تو php هم مثل c++ اشاره گر وجود داره که بشه از حافظه سرور بصورت بهینه استفاده کرد؟
(11 ماه و 10 روز و 6 ساعت و 3 دقیقه پیش)

علی : بسیار عالی
(11 ماه و 6 روز و 18 ساعت و 2 دقیقه پیش)

لعيا احمدي : سلام
از اطلاعات خوبي كه در اختيارمون گذاشتي ممنونم
من يك پروژه دارم كه با php مي خوام بنويسمش اما آشنايي زيادي ندارم . سوالاتي برام پيش اومده در خصوص رزرو غير حضوري وقت و... چه طوري مي تونم از شما كمك بگيرم؟
بازم به خاطر سايت خوبتون ممنونم
(11 ماه و 6 روز و 4 ساعت و 41 دقیقه پیش)

reza : آقا به این دو تا لینک زیر سر بزن شنگول میشی، جواب سوال مارو که ندادی!

http://validator.w3.org/check?uri=http%3a%2f%2fboplo%2eir%2fphp%2fphp%2dgolden%2dtips%2f

http://jigsaw.w3.org/css-validator/validator?uri=http%3A%2F%2Fboplo.ir%2Fphp%2Fphp-golden-tips%2F
(11 ماه و 3 روز و 18 ساعت و 7 دقیقه پیش)

امیرحسین : از این خطاها خبر دارم. اگه وقت اجازه بده قصد دارم کلا قالب رو عوض کنم.
(11 ماه و 3 روز و 17 ساعت و 41 دقیقه پیش)

امیرحسین : در ضمن آدرس ایمیلت رو هر دفعه یه چیز وارد میکنی که وجود نداره و جواب ایمیلهات رو نمی تونم بدم!
(11 ماه و 3 روز و 17 ساعت و 40 دقیقه پیش)

مهدی : امیرحسین واقعا کارت عالیه :*:*:* !
ممنون :*:*:*
(11 ماه و 3 روز و 15 ساعت و 7 دقیقه پیش)

میلاد : انصافا مطلب خوبی نوشته بودی.
(11 ماه و 3 روز و 10 ساعت و 40 دقیقه پیش)

مسعود : سلام امیر حسین
دمت گرم واقعا خیلی قشنگ نگارش شده

من یه مشکل دارم اونم اینه که نمی تونم از توابع عکس استفاده کنم میشه یکی دو تا نمونه از توابع عکس استفاده کنی اموزش رو بدی من راه بیافتم هر کاری کردم نشد گیر داره
(10 ماه و 23 روز و 18 ساعت و 31 دقیقه پیش)

یک دوست : Dadash Vaghean Axe Alberti Dari
in axet To Cloob Mano Shahid Kard KHodayi

-
Rasti DaDash Page Mofidi Dari Dost Dashti To sitemon Linket mikonim
agar dostdashti Behemon Sar bezan KHabRam Kon
Fadaye To
HabSeto BekeshiM Dadaaaaaaash
(10 ماه و 18 روز و 13 ساعت و 42 دقیقه پیش)

محمد : سلام امير حسين جان
آقا چطور ميشه جواب ما هم بديد »»به جايي بر نمي خوره ها
من به بانك پارسيان وصل شدم و پرداخت به صورت كامل انجام ميشه ولي وقتي پرداخت كامل شد و به صفحه سايتم برگشت مي زنه خطاي نا مشخص بعد از يك ساعت هم پولي كه از حساب مشتري كم شده بود دوباره به حسابش اضافه ميشه حالا چيكار كنم؟

راستي اگه يادت باشه تو سايت برنامه نويس بود كه براتون پيام خصوصي گذاشته بودم
و اونجا گفته بودم كه از اسكريپت سبد خريد استفاده مي كنم....
(10 ماه و 17 روز و 3 ساعت و 3 دقیقه پیش)

امیرحسین : بانک پارسیان وقتی داره کاربر رو به سایت برمیگردونه مقدار status رو هم به آدرس اضافه میکنه. با GET_$ میتونید بگیریدش.
در فایلهایی که این بانک در اختیارتون میذاره یک فایل به نام pgwStatus.cs وجود داره. در این فایل همه ی Statusهای ممکن رو لیست کرده به همراه علت رخدادشون...
Status و توضیحش رو بررسی کنید. اگر به کدنویسی مربوط میشد رفعش کنید در غیر اینصورت با پشتیبانی بانک تماس بگیرید.
(10 ماه و 16 روز و 21 ساعت و 23 دقیقه پیش)

Moslem : سلام
حقیقتا مفید بود!
ممنون بابت زحمتی که کشیدی.
خود من خیلی مطالب ازش یاد گرفتم.
(10 ماه و 9 روز و 20 ساعت و 41 دقیقه پیش)

ماهان : سلام. خیلی حفن بود دستت true !.

راستی یه سوال. من قبلا بخاطر یه موضوعی گیر کرده بودم که توی مثال اول شما نوشتی

$str = 'Boplo.ir';
$bool1 = (bool) $str;
$bool2 = setType($str, 'bool');
$bool3 = !!$str;

فکر کنم اگه ما برای رشته از ' بجای " استفاده کنیم php یه error مبنی بر اینکه شما دارید از کاراکتر تعریف ثابت استفاده می کنید برای تعریف رشته.

یه توضیحی لطفا کنی بد نیست. ممنون !
(10 ماه و 9 روز و 7 ساعت و 49 دقیقه پیش)

محمد : ممنون همش بدرد بخور بود
(9 ماه و 10 روز و 5 ساعت و 44 دقیقه پیش)

محمد : من اهل نظر دادن نیست؛ ولی از بس کارت خوب بود، نمیشد نظر نداد.
(8 ماه و 26 روز و 7 ساعت و 38 دقیقه پیش)

آگاه! : منم حال و حوصلهء نظر دادن ندارم معمول و دیدم خیلی کارت تمیزِ دلم نیومد بدونِ تشکر بزارم.

دسِت مرسی
(8 ماه و 3 روز و 13 ساعت و 2 دقیقه پیش)

Moeini : ممنون
فوق العاده بود .
(8 ماه و 3 روز و 6 ساعت و 36 دقیقه پیش)

جواد : از ارائه تجربيات تان تشكر مي كنم.
(7 ماه و 27 روز و 20 ساعت و 5 دقیقه پیش)

بهار : خیلی ممنون.مفید بود.
(7 ماه و 24 روز و 21 ساعت و 21 دقیقه پیش)

احسان درودی : مطلب بسیار خوبی بود. دست شما درد نکنه.
(7 ماه و 15 روز و 20 ساعت و 26 دقیقه پیش)

آرمان : بسیار عالی بود. دست مریزاد. نکات عالی رو بیان کردی. سپاس
(7 ماه و 11 روز و 12 ساعت و 32 دقیقه پیش)

محمد : سلام
واقعا ازت ممنونم بعضی ها برای یاد دادن همینا کلی منت میزارنو کلی پول طلب میکنن ولی شما با کمال صداقت یاد دادی. به شخصه ازت خیلی خیلی خیلی خیلی.............
تشکر میکنم کاره منو که خیلی جلو انداخت مطالب شما
بازهم تشکر.........
(7 ماه و 10 روز و 6 ساعت و 30 دقیقه پیش)

یک دوست : واقعا عالي بود
(5 ماه و 9 روز و 18 ساعت و 3 دقیقه پیش)

nasrin : مرسی شنگول شدیم
(2 ماه و 12 روز و 14 ساعت و 57 دقیقه پیش)

صابر : خیلی خیلی مفید بود 99% رو نشنیده بودم عالی بود
(2 ماه و 11 روز و 8 ساعت و 4 دقیقه پیش)

یه صابر دیگه : سلام. مطلب مفید بود. سپاسگزارم.
(26 روز و 10 ساعت و 43 دقیقه پیش)

sweetheart : سلام مطالب مفيد بود.من يه پروژه دارم كه بايد به زبان phpدرست كنم.ميشه آدرس ايميلتونو بنويسين كه اگه مشكلي داشتم ازتون كمك بگيرم.البته اگه زحمتي نيست
(23 روز و 12 ساعت و 3 دقیقه پیش)

یک دوست : موفق باشی
(19 روز و 11 ساعت و 33 دقیقه پیش)

Omid Naghdi : از خوندنش لذت بردم ولی خیلی دیر خوندمش
خدایا اونایی که خدمت مقدس سربازی رو گذاشتن و باعث دور شدن ما از علم شدن رو نبخش
(12 روز و 20 ساعت و 32 دقیقه پیش)

 

me

امیرحسینم. اسمم رو دوست دارم، خودم رو دوست دارم. تهران زندگی می کنم. فارغ التحصیل مهندسی صنایع هستم. برنامه‌نویسی و طراحی وب می کنم. در واقع Web Developer محسوب میشم. برنامه نویسی و وقت گذرونی با وب تنها کاریه که خسته ام نمی کنه.
آدم خیلی سردی هستم، اینو دور و وری هام میگن. ولی به نظر خودم سرد نیستم در واقع گرمای خودم رو کم بروز می دم! آدما رو اغلب دوست دارم غیر از اون مواقعی که اونا من رو نادیده میگیرن!

این سایت رو بعد از کلی اینور اونور دوباره راه انداختم تا هرچی دوست دارم توش بنویسم، چه کسی بخونه چه نخونه.
خلاصه اینجا خونه منه،

به خونه امیرحسین خوش اومدی...

MODx | Template World