به نام دانای بر حق
اولین یادداشت ۹۴ رو میزنم به افتخار همه اساتید xmen که ما شاگردشون هستیم، می خوایم در مورد ۷ مورد از عجایبی که در زبان php وجود داره صحبت کنیم که برای کسایی که با زبان های دیگه دارن کار می کنند شاید بسیار عجیب باشه.
مقدمه
البته که php علاوه بر عشق یه زبان تحت وب نیز هست ; ) , باید به این مورد توجه کرد که php خیلی راه دست هستش و با هیچ زبان دیگه ای نمی تونین مقایسه اش کنین حتی Python من خودم اگر بخوام یه برنامه رو جدا از پلت فرمش بنویسم ۱۰۰٪ پایتون رو انتخاب می کنم چون خیلی راه دست هست و هلو برو تو گلو ولی خوب PHP واقعا یه چیز دیگه است چون اصلا این بچه مظلومه و بلد نیست به کد نویسش سخت بگیره و اذیتش کنه D : , حالا اینا رو بی خیال شیم بیایم کمی در مورد ساختار این زبان صحبت کنیم چرا که برخی از این عجایب به ساختار این زبان بستگی داره، خب php عزیز یه زبان برنامه نویسی نیست یه زبان اسکریپت نویسی تحت وب هستش هستش که در تقریبا اکثر سیستم عامل های معروف قابل اجراست، حالا این یعنی چی یعنی این که کد های PHP هرگز کامپایل نمیشوند مثل یه برنامه دلفی و فقط و فقط تفسیر میشود، تفاوتی اصلی از اونجا ناشی میشود که وقتی کدی کامپایل میشود اطلاعت نامی و و متنی آن تقریبا از بین میره و فقط آدرس کلاس ها و توابع در برنامه باقی میماند ، اما چون در PHP همچین کاری نمیشه همه چیز به قوت خود باقی هستش که شما لذت ببرید و بعضی جاها هم حرص بخورید که مجبورید اصل سورس کد رو تحویل مشتری عزیز بدین : )
عجب اول – تعریف متغییر و آرایه
چیزی که اول هر برنامه نویسی رو متعجب می کنه این هستش که php چرا تعریف متغییر ندارد!؟ واقعا چرا؟ چراشو نمیدونم ولی خیلی خوبه که نداره شما رو درگیر کد نویسی می کنه نه قواعد سخت گیرانه خودش برای راحتی خودش برنامه نویس رو ناراحت نمی کنه، و نکته بعدی این که از Associative array هم پشتیبانی می کنه که این خیلی خوبه و اما توضیحات:
تعریف یه متغییر در php :
$var1 = 1; $var1 = null; $var1 = true; $var1 = "4xmen";
ببین ما فقط کافی نسبت بدی خودش نوعش هم مشخص می کنه : )
تعریف آرایه :
$arr = array('test','0777'); // or $arr2[0] = 'test'; $arr2[1] = '0777'; $arr2[99] = 'Mahdiam';
در خط اول ما به شرایط تعریف کردیم و در قسمت دوم با هر کلیدی دوست داشتیم آرایه رو تعریف کردیم بینیم که بعد از کلید ۰ و ۱ ما ۹۹ استفاده کردیم و مشکل هم نیست
تعریف آرایه Associative (آرایه هایی که به جای عدد از حروف و اعداد به عنوان کلید استفاده می کند)
$server['hostname'] = 'localhost'; $server['database'] = 'test'; $server['username'] = 'root'; $server['password'] = 'password' ; // 2d array $all['myserver']['hostname'] = 'localhost' ;
تازه یکیش هم دو بعدیه دیدی چقدر ساده اس بعد بگین php بده اَسپ ( asp ) خوبه : )
عجب دوم – شناخت زمان
در php یه عجب خیلی خفن وجود داره این که خیلی ساده هر زمانی رو بهش بگی میفهمه مثلا ازش بپرسی من کلاس اول کی املا رو صفر شدم و از بابام کتک خوردم بهت میگه باور کن ; )
میگی نه نگاه کن یه تابع داریم به نام strtotime یعنی تبدیل رشته به زمان باید قبل از این به یه چیزی توجه داشت اونم این که تو php از timestamp استفاده میشه یعنی زمان همیشه یه عدد بزرگ هستش که اون عدد برمیگرده تا شما باهاش کار کنید. این مثلا این شکلی هست۱۴۲۷۶۱۴۷۵۹ و تعداد ثانیه هایی که از این اولین لحظه۱۹۷۰/۰۱/۰۱ گذشته رو نشون میده پس ما این عدد رو مدام نیاز داریم حالا ببینم چطور این رو تحویل ما میده:
echo strtotime("now"), "\n"; // alan echo strtotime("10 September 2000"), "\n"; // 10 sep 2000 echo strtotime("+1 day"), "\n"; // ye roz bad echo strtotime("+1 week"), "\n"; // hafte bad echo strtotime("+1 week 2 days 4 hours 2 seconds"), "\n" ;// hafteye bad ruze 2omesh saat 4omesh saniye 2omesh echo strtotime("next Friday"), "\n"; // jomeye badi echo strtotime("last Monday"), "\n"; // yekshabe ghabli echo strtotime('first day of next month'), "\n"; // avalin ruze mahe bad echo strtotime('midnight first day of last month'), "\n"; // nime shabe ruze avale mahe ghabl
دیگه کامنت هاش مشخصه توضیح ندم، انصافا ازش بپرسی کی نونوایی خلوته هم بهت میگه ها : )
عجب سوم – نمایش آرایه ها و کلاس ها
یکی از چیزهایی که در PHP بسیار واسم جالب بودش نحوه نمایش آرایه ها و کلاس ها بودش که دو مورد وجود داره یکی print_r هست و بعدی var_dump هستش به نمونه کد زیر نگاه کنین چقدر تمیز برمیگردونه:
$a = array(1, 2, array("a", "b", "c")); var_dump($a);
و اما نتیجه:
array(3) { [۰]=> int(1) [۱]=> int(2) [۲]=> array(3) { [۰]=> string(1) "a" [۱]=> string(1) "b" [۲]=> string(1) "c" } }
این هم در مورد یه کلاس:
class animal { var $type; var $says; function __construct($_type) { $type = $_type; } function Does_he_think_hes_the_boss() { return ($type == 'cat'); } } // animal $dog = new animal('dog'); var_dump($dog);
نتیجه:
عجب چهارم – محصور کردن string
یکی از چیزهایی که تو اکثر زبان ها ها اذیت میکنه محصور کردن رشته ها هستش وقتی شما داخل C مثلا میخوای از ” استفاده کنید دابل کوتیشن رو نمیتونین مستقیم استفاده کنید باید حتما کارکتر رو ببرید مثل ولی فقط میتونین از دابل کوتیشن برای محصور کردن استفاده کنید و برای رفت به خط بعدی مصیبت دارین اما در PHP این مشکلات نیست شما اول از همه میتونین هم از سینگل و دابل کوتیشن استفاده کنین البته هر کدوم ویژگی های خاص خودش رو داره و هر جا اراده کنین برین خط بعدی نیازی به بستن کوتیشن و اضافه کردن کارکتر های امثال n\ نیست به سادگی امکان پذیر هست این ببینید:
$var = '4xmen'; $xmen = " salam bar shoma joyaye elam ------ inja site $var hast".' ina ham matb=n " dsdsa \' siudsf '; echo $xmen;
نتیجه:
salam bar shoma joyaye elam ------ inja site 4xmen hast ina ham matb=n " dsdsa ' siudsf
خب حالا یه نکته وجود داره اگر شما یه متن داشتین پر از ‘ و ” بودش ترکیبی باید چه کار کنید آیا php راهی برای شما در نظر گرفته؟
به کد زیر توجه کنید:
echo <<<XMEN Property example $a '''' 4xmen """"" WTF XMEN;
ببینید سه تا >>> وجود داره بعدش یه کلمه کلیدی که مطمپن باشید تو متن نیست حساس به حروف کوچیک و بزرگ و بعد هر چه دلت تنگت می خواهد بگو و بعد در ابتدای یک خط همون کلمه کلیدی تکرار میشه فارق از هر کارکتری که در نظر هست.
اما نتیجه:
Property example a1 '''' 4xmen """"" WTF
اینم از این جالب بود؟ : )
عجب پنجم – بلاک های متفاوت – Alternative syntax for control structures
یکی از چیزهایی که توز زبان های وابسته به syntax معروف C وجود داره استفاده از آکولاد برای تفکیک بلاک های کد ها با هم است خوب این خوبه ها ولی بعضی جا ها خیلی اعصاب خورد کن میشه خصوصا تو PHP که شما ممکنه کد های HTML رو وسط کدهاتون داشته باشین اون موقع بین آکولاد ها گم خواهید شد به کد زیر دقت کنید
<?php if ($aaa == true) { ?> <!DOCTYPE HTML> <html> <head> <meta http-equiv="content-type" content="text/html;charset=utf-8"/> <meta name="author" content="info@0777.ir" /> <meta name="Keywords" content="0777.ir,forum,game,Tutorial,distro,index" /> <meta name="Description" content="0777.ir , forum ,Tutorial , Distro , index , google , link" /> <meta name="robots" content="index , follow" /> <meta property='og:image' content="http://0777.ir/img/google.jpg" /> <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon" > <link rel="image_src" href="http://0777.ir/img/google.jpg"/> <title> 0777 - Index</title> <style type="text/css"> <!-- td{padding:10px;text-align: center;} a{color:#0080FF;text-decoration:none;} a:visited{color:#0080FF;} a:hover,a:visited:hover{color:#005680;} --> </style> </head> <?php } ?>
خب آیا پیدا کردن این آکولاد ساده اس؟ حالا آکولاد همیشه برای هم if , هم برای for و هم برای foreach و هم برای while و هم برای dowhile برای switch هم که هست پس اینجا این چند تا با هم قاطی بشند کد نا خوانا میشه برای حل این مشکل یه راهی پیش رو ما گذاشتن بسیار جالب هستش حالا به syntax اینها دقت کنین:
<?php if ($a == 5): ?> A is equal to 5 <?php endif; ?> <?php if ($a == 5): echo "a equals 5"; echo "..."; elseif ($a == 6): echo "a equals 6"; echo "!!!"; else: echo "a is neither 5 nor 6"; endif; ?> <?php switch ($foo): ?> <?php case 1: ?> ... <?php endswitch ?> <?php foreach($array as $element): ?> #do something <?php endforeach; ?>
پر واضح هستش که چطور آکولاد رو حذف کردیم و به جاش از کلامات کلیدی دیگه استفاده کردیم مثل endif , else: ,.endforeach و سایر موارد نیز اینچنین هست مثلا while(): endwhile;
این ها هم در نوع خودشون بی نظیر و عجیب هست.
عجب ششم – متغییر های با نام متغیر و توابع متغییری
یکی از چیز هایی که در php شما رو به کد زیر توجه کنید:
$take = 'Mahdiam' ; $var = 'take' ; echo $$var;
به نظر شما اینجا نتیجه چی نمایش داده میشه بله Mahdiam نمایش داده میشه چون داخل var کلمه take نوشته و دنبال متغییر $take میگرده و نمایش میده اتش.
اما این مورد در مواقع توابع هم صدق می کند:
$function = 'phpinfo'; $function();
کد زیر تابع phpinfo را اجرا می کند و شما میتوانید از کدنویسی خود لذت ببرید.
عجب هفتم – همه چیز به عنوان متغییر
class MyClass { function __construct() { echo "my class create <br />"; } function test($str) { echo ' tested '.$str ; } } $clsname = 'MyClass' ; $fnc = 'test' ; $cls = new $clsname(); $cls->$fnc(' 4xmen.ir'); $str = 'SadeghPM' ; echo '<br />'; call_user_func(array($cls,$fnc),$str);
به کد بالا تجوه کنید ما ابتدا کلاس myclass ور تعریف کردیم سپس اسمش رو ریختیم تو یه متغییر و بعد ازش مشتق کردیم و بعد تابع test رو ریختیم تو یه متغییر و ازش اجرا گرفتیم زیر مجموعه cls و در آخر از تابع call_user_func استفاده کرده و یه بار دیگه تابع رو اجرا کردیم
بحث آخر
باور نکردنی این انعطاف اگر یه بار با یه زبان native کار کرده باشید متوجه میشم چی میگم.
همین ویژگی ها باعث میشه شما تو معماری نرم افزار اتون راحت باشید آیا تا حالا به این فکر کردین این انعطاف چقدر مناسب معماری MVC هستش؟ آیا نمیشه یه Bootstrap ناز با این ویژگی ها نوشتش که خودش خودکار کلاس ها و توابع مورد نظر ما رو فراخونی کنه؟ : )
شاید آموزش های بعدی در همین مورد باشه ; )
با ما همراه باشید – 4xmen – فروردین ۱۳۹۴
دیدگاهتان را بنویسید لغو پاسخ