برای طرح سوال و دسترسی به آموزش ها  کانال ما در تلگرام بپویندید  

عجایب هفتگانه زبان php – در ساختار و کدنویسی

به نام دانای بر حق

اولین یادداشت ۹۴ رو میزنم به افتخار همه اساتید 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' ;    

// ۲d 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     
        '''' ۴xmen """""
WTF
XMEN;

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

اما نتیجه:

Property example 
  a1     
        '''' ۴xmen """""
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 ناز با این ویژگی ها نوشتش که خودش خودکار کلاس ها و توابع مورد نظر ما رو فراخونی کنه؟ : )

شاید آموزش های بعدی در همین مورد باشه ; )

با ما همراه باشید – ۴xmen –  فروردین ۱۳۹۴

 

 


انتشار

در

,

توسط

برچسب‌ها:

نظرات

3 پاسخ به “عجایب هفتگانه زبان php – در ساختار و کدنویسی”
  1. SadeghPM

    یکی دیگه از مواردی که من اوایل کار با php همیشه تعجب میکردم این بود که :
    ؛ هر کار معمولی روی data که تو زبان های دیگه با کلی شرط و حلقه حل میشه تو php جزو توابع native‌هست:

    1. Mahdiam

      آره واقعا مثلا sort array و merg array و هزار تا چیز از این دست کاملا موافقم استاد.

  2. Ehsaan

    دم تو و PHP با هم گرم!
    Bookmarked 😉

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *