Skip to content

3. مبانی PHP

3.1. یک مثال اول

در زیر برنامه‌ای آمده است که ویژگی‌های پایه‌ای PHP را نشان می‌دهد.

3.1.1. برنامه (exemple_01)


<?php

// این یک نظر است
// متغیر بدون اعلام قبلی استفاده شده
$nom = "dupont";

// یک نمایش صفحه
print "nom=$nom\n";

// یک آرایه با عناصر از انواع مختلف
$tableau = array("un", "deux", 3, 4);

// تعداد عناصر آن
$n = count($tableau);

//یک حلقه
for ($i = 0; $i < $n; $i++)
  print "tableau[$i]=$tableau[$i]\n";

// ابتدایی‌سازی دو متغیر با محتویات یک آرایه
list($chaine1, $chaine2) = array("chaine1", "chaine2");

//الحاق دو رشته
$chaine3 = $chaine1 . $chaine2;

// نمایش نتیجه
print "[$chaine1,$chaine2,$chaine3]\n";

// استفاده از یک تابع
affiche($chaine1);

// نوع یک متغیر ممکن است مشخص باشد
afficheType($n);
afficheType($chaine1);
afficheType($tableau);

// نوع یک متغیر می‌تواند در زمان اجرا تغییر کند
$n = "a changé";
afficheType($n);

// یک تابع می‌تواند یک نتیجه بازگرداند
$res1 = f1(4);
print "res1=$res1\n";

//یک تابع می‌تواند یک آرایه از مقادیر را بازگرداند
list($res1, $res2, $res3) = f2();
print "(res1,res2,res3)=[$res1,$res2,$res3]\n";

//این مقادیر می‌توانستند در یک آرایه بازیابی شوند
$t = f2();
for ($i = 0; $i < count($t); $i++)
  print "t[$i]=$t[$i]\n";

// آزمایش‌ها
for ($i = 0; $i < count($t); $i++)
//فقط کانال‌ها را نمایش می‌دهد
  if (getType($t[$i]) == "string")
    print "t[$i]=$t[$i]\n";

// آزمایش‌های بیشتر
for ($i = 0; $i < count($t); $i++){
// فقط اعداد صحیح بزرگ‌تر از ۱۰ را نمایش می‌دهد
  if (getType($t[$i]) == "integer" and $t[$i] > 10)
    print "t[$i]=$t[$i]\n";
}

//یک حلقه while
$t = array(8, 5, 0, -2, 3, 4);
$i = 0;
$somme = 0;
while ($i < count($t) and $t[$i] > 0) {
  print "t[$i]=$t[$i]\n";
  $somme+=$t[$i];   //$somme=$somme+$t[$i]
  $i++;             //$i=$i+1
}
print "somme=$somme\n";

//پایان برنامه
exit;

//----------------------------------
function affiche($chaine) {
  // نوع $chaine را نمایش می‌دهد
  print "chaine=$chaine\n";
}

//----------------------------------
function afficheType($variable) {
  // نوع $variable را نمایش می‌دهد
  print "type[$variable]=" . getType($variable) . "\n";
}

//----------------------------------
function f1($param) {
  // عدد ۱۰ را به $param اضافه می‌کند
  return $param + 10;
}

//----------------------------------
function f2() {
  // سه مقدار را بازمی‌گرداند
  return array("un", 0, 100);
}
?>

نتایج:

nom=dupont
tableau[0]=un
tableau[1]=deux
tableau[2]=3
tableau[3]=4
[chaine1,chaine2,chaine1chaine2]
chaine=chaine1
type[4]=integer
type[chaine1]=string
type[Array]=array
type[a changé]=string
res1=14
(res1,res2,res3)=[un,0,100]
t[0]=un
t[1]=0
t[2]=100
t[0]=un
t[2]=100
t[0]=8
t[1]=5
somme=13

توضیحات

  • خط ۵: در PHP، نوع متغیرها اعلام نشده است. این‌ها دارای نوع پویا هستند که ممکن است در طول زمان تغییر کند
  • $nom نمایانگر متغیری با شناسه‌ی nom است
  • خط ۸: برای خروجی گرفتن به صفحه نمایش، می‌توانید از عبارت print یا عبارت echo استفاده کنید
  • خط ۱۱: کلمه کلیدی array برای تعریف یک آرایه استفاده می‌شود. متغیر $nom[$i] نمایانگر عنصر $i از آرایه $tableau است.
  • خط ۱۴: تابع count($tableau) تعداد عناصر آرایه $tableau را برمی‌گرداند
  • خط ۱۸: رشته‌ها در گیومهٔ دوبل " یا گیومهٔ تکی ' محصور شده‌اند. در داخل گیومهٔ دوبل، متغیرهای $variable ارزیابی می‌شوند، اما در داخل گیومهٔ تکی ارزیابی نمی‌شوند.
  • خط ۲۱: تابع list به متغیرها اجازه می‌دهد تا در یک لیست گروه‌بندی شده و با یک عملیات تخصیص واحد، یک مقدار به آن‌ها اختصاص یابد. در اینجا، $chaine1="string1" و $chaine2="string2" هستند.
  • خط 24: عملگر . عملگر الحاق رشته‌ها است.
  • خط ۸۸: کلمه کلیدی function یک تابع را تعریف می‌کند. یک تابع ممکن است از طریق دستور return مقادیری را بازگرداند یا بازنگرداند. کد فراخوانی می‌تواند نتایج تابع را نادیده بگیرد یا بازیابی کند. یک تابع می‌تواند در هر نقطه‌ای از کد تعریف شود.
  • خط ۹۰: تابع از پیش تعریف شده getType($variable) یک رشته را که نمایانگر نوع $variable است بازمی‌گرداند. این نوع ممکن است در طول زمان تغییر کند.
  • خط ۷۹: تابع از پیش تعریف‌شده exit اسکریپت را خاتمه می‌دهد.

3.2. دامنهٔ متغیرها

3.2.1. برنامه ۱ (exemple_02)


<?php

// دامنهٔ متغیرها

function f1() {
  // متغیر سراسری $i استفاده می‌شود
  $i = &$GLOBALS["i"];
  $i++;
  $j = 10;
  print "f1[i,j]=[$i,$j]\n";
}

function f2() {
  // متغیر سراسری $i استفاده می‌شود
  $i = &$GLOBALS["i"];
  $i++;
  $j = 20;
  print "f2[i,j]=[$i,$j]\n";
}

function f3() {
  //یک متغیر محلی $i استفاده می‌شود
  $i = 4;
  $j = 30;
  print "f3[i,j]=[$i,$j]\n";
}

// آزمایش‌ها
$i = 0;
$j = 0;  // این دو متغیر از طریق آرایه $GLOBALS برای تابع f قابل دسترسی هستند
f1();
f2();
f3();
print "test[i,j]=[$i,$j]\n";
?>

نتایج:

1
2
3
4
f1[i,j]=[1,10]
f2[i,j]=[2,20]
f3[i,j]=[4,30]
test[i,j]=[2,0]

توضیحات

  • خطوط ۲۹–۳۰: دو متغیر $i و $j را در برنامه اصلی تعریف کنید. این متغیرها در داخل توابع شناسایی نمی‌شوند. بنابراین، در خط ۹، متغیر $j در تابع f1 یک متغیر محلی تابع f1 است و با متغیر $j در برنامه اصلی متفاوت است. یک تابع می‌تواند از طریق آرایه‌ای از متغیرهای سراسری به نام $GLOBALS به متغیر $variable در برنامه اصلی دسترسی داشته باشد. در خط ۷، نشانه $GLOBALS["i"] به متغیر سراسری $i در برنامه اصلی اشاره دارد. اگر بنویسیم
$i=$GLOBALS["i"]

یک متغیر محلی $i با مقدار متغیر سراسری $i مقداردهی می‌شود. این دو متغیر متفاوت هستند و تغییر متغیر محلی $i باعث تغییر متغیر سراسری $i نخواهد شد. نشانه‌گذاری

$i=&Globals["i"]

به این معنی است که متغیر محلی $i همان نشانی حافظه متغیر سراسری $i را دارد. بنابراین دستکاری متغیر محلی $i معادل دستکاری متغیر سراسری $i است.

3.2.2. برنامه ۲ (exemple_03)


<?php

// دامنه یک متغیر در بلوک‌های کد جهانی است
$i = 0; {
  $i = 4;
  $i++;
}
print "i=$i\n";
?>

نتایج:

i=5

توضیحات

در برخی زبان‌ها، متغیری که درون کروشه‌های منحنی تعریف می‌شود، دامنه‌ای محدود به آن کروشه‌ها دارد: خارج از آن‌ها شناخته نمی‌شود. نتایج بالا نشان می‌دهد که در PHP این‌طور نیست. متغیر $i که در خط ۵ درون پرانتزهای منحنی تعریف شده، همان متغیری است که در خطوط ۴ و ۸ بیرون از آن‌ها استفاده شده است.

3.3. آرایه‌ها

3.3.1. آرایه‌های یک‌بعدی استاندارد (exemple_04)


<?php

// آرایه‌های متعارف
// ابتدایی‌سازی
$tab1 = array(0, 1, 2, 3, 4, 5);

// تکرار – ۱
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
  print "tab1[$i]=$tab1[$i]\n";

// تکرار - ۲
print "tab1 a " . count($tab1) . " éléments\n";
reset($tab1);
while (list($clé, $valeur) = each($tab1))
  print "tab1[$clé]=$valeur\n";

//افزودن عناصر
$tab1[] = $i++;
$tab1[] = $i++;

// تکرار – ۳
print "tab1 a " . count($tab1) . " éléments\n";
$i = 0;
foreach ($tab1 as $élément) {
  print "tab1[$i]=$élément\n";
  $i++;
}

//حذف آخرین عنصر
array_pop($tab1);

//تکرار - ۴
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
  print "tab1[$i]=$tab1[$i]\n";

// حذف اولین عنصر
array_shift($tab1);

// تکرار - ۵
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
  print "tab1[$i]=$tab1[$i]\n";

// افزودن به انتهای آرایه
array_push($tab1, -2);

// تکرار - 6
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
  print "tab1[$i]=$tab1[$i]\n";

// افزودن به ابتدای آرایه
array_unshift($tab1, -1);

//تکرار - ۷
print "tab1 a " . count($tab1) . " éléments\n";
for ($i = 0; $i < count($tab1); $i++)
  print "tab1[$i]=$tab1[$i]\n";
?>

نتایج:

tab1 a 6 éléments
tab1[0]=0
tab1[1]=1
tab1[2]=2
tab1[3]=3
tab1[4]=4
tab1[5]=5
tab1 a 6 éléments
tab1[0]=0
tab1[1]=1
tab1[2]=2
tab1[3]=3
tab1[4]=4
tab1[5]=5
tab1 a 8 éléments
tab1[0]=0
tab1[1]=1
tab1[2]=2
tab1[3]=3
tab1[4]=4
tab1[5]=5
tab1[6]=6
tab1[7]=7
tab1 a 7 éléments
tab1[0]=0
tab1[1]=1
tab1[2]=2
tab1[3]=3
tab1[4]=4
tab1[5]=5
tab1[6]=6
tab1 a 6 éléments
tab1[0]=1
tab1[1]=2
tab1[2]=3
tab1[3]=4
tab1[4]=5
tab1[5]=6
tab1 a 7 éléments
tab1[0]=1
tab1[1]=2
tab1[2]=3
tab1[3]=4
tab1[4]=5
tab1[5]=6
tab1[6]=-2
tab1 a 8 éléments
tab1[0]=-1
tab1[1]=1
tab1[2]=2
tab1[3]=3
tab1[4]=4
tab1[5]=5
tab1[6]=6
tab1[7]=-2

نظرات

برنامه بالا عملیات دستکاری آرایه‌ای از مقادیر را نشان می‌دهد. در PHP دو نشانه برای آرایه‌ها وجود دارد:

$tableau=array("un",2,"trois")
$contraires=array("petit"=>"grand", "beau"=>"laid", "cher"=>"bon marché")

آرایه ۱ آرایه و آرایه ۲ دیکشنری نامیده می‌شود، جایی که عناصر به صورت کلید => مقدار نشان داده می‌شوند. نشانه‌گذاری $contraires["beau"] به مقداری اشاره دارد که با کلید «beautiful» مرتبط است. در این مورد، این مقدار رشته «ugly» است. آرایه 1 صرفاً یک نوع از دیکشنری است و می‌تواند به صورت زیر نوشته شود:

$tableau=array(0=>"un",1=>2,2=>"trois")

بنابراین، ما داریم $tableau[2] = "three". در نهایت، تنها دیکشنری‌ها وجود دارند. در مورد یک آرایهٔ متعارف از عناصر n، کلیدها اعداد صحیح در بازهٔ [0,n-1] هستند.

  • خط 15: تابع each($tableau) برای تکرار روی یک دیکشنری استفاده می‌شود. در هر فراخوانی، یک جفت (کلید، مقدار) از دیکشنری بازمی‌گرداند.
  • خط ۱۴: تابع reset($dictionnaire) تابع each را روی اولین جفت (کلید، مقدار) در دیکشنری تنظیم می‌کند.
  • خط ۱۵: حلقه while زمانی پایان می‌یابد که تابع each در پایان دیکشنری یک جفت خالی بازگرداند.
  • خط ۱۹: نشانه $tableau[]=value عنصر valeur را به‌عنوان آخرین عنصر $tableau اضافه می‌کند.
  • خط ۲۵: آرایه با استفاده از foreach پیمایش می‌شود. این عنصر نحوی اجازه می‌دهد تا یک دیکشنری – و در نتیجه یک آرایه – با استفاده از دو نحوی متفاوت پیمایش شود:
foreach($dictionnaire as $clé=>$valeur)
foreach($tableau as $valeur)

سینتکس اول در هر تکرار یک جفت (clé,valeur) را بازمی‌گرداند، در حالی که سینتکس دوم تنها عنصر valeur را از دیکشنری بازمی‌گرداند.

  • خط ۳۱: تابع array_pop($tableau) آخرین عنصر را از $tableau حذف می‌کند
  • خط ۳۹: تابع array_shift($tableau) اولین عنصر را از $tableau حذف می‌کند
  • خط ۴۷: تابع array_push($tableau,value) عنصر آخر valeur را به $tableau اضافه می‌کند
  • خط ۳۹: تابع array_unshift($tableau,value) عنصر valeur را به عنوان اولین عنصر $tableau اضافه می‌کند

3.3.2. واژه‌نامه (exemple_05)


<?php

// فرهنگ‌ها
$conjoints = array("Pierre" => "Gisèle", "Paul" => "Virginie", "Jacques" => "Lucette", "Jean" => "");

// تکرار - ۱
print "Nombre d'éléments du dictionnaire : " . count($conjoints) . "\n";
reset($conjoints);
while (list($clé, $valeur) = each($conjoints))
  print "conjoints[$clé]=$valeur\n";

//مرتب‌سازی فرهنگ لغت بر اساس کلید
ksort($conjoints);

// تکرار - ۲
reset($conjoints);
while (list($clé, $valeur) = each($conjoints))
  print "conjoints[$clé]=$valeur\n";

// فهرست کلیدهای دیکشنری
$clés = array_keys($conjoints);
for ($i = 0; $i < count($clés); $i++)
  print "clés[$i]=$clés[$i]\n";

// فهرست مقادیر فرهنگ لغت
$valeurs = array_values($conjoints);
for ($i = 0; $i < count($valeurs); $i++)
  print "valeurs[$i]=$valeurs[$i]\n";

//جستجو برای یک کلید
existe($conjoints, "Jacques");
existe($conjoints, "Lucette");
existe($conjoints, "Jean");

//حذف یک جفت کلید-مقدار
unset($conjoints["Jean"]);
print "Nombre d'éléments du dictionnaire : " . count($conjoints) . "\n";
foreach ($conjoints as $clé => $valeur) {
  print "conjoints[$clé]=$valeur\n";
}

//پایان
exit;

function existe($conjoints, $mari) {
  //بررسی می‌کند که آیا کلید $mari در فرهنگ لغت $conjoints وجود دارد یا خیر
  if (isset($conjoints[$mari]))
    print "La clé [$mari] existe associée à la valeur [$conjoints[$mari]]\n";
  else
    print "La clé [$mari] n'existe pas\n";
}

?>

نتایج:

Nombre d'éléments du dictionnaire : 4
conjoints[Pierre]=Gisèle
conjoints[Paul]=Virginie
conjoints[Jacques]=Lucette
conjoints[Jean]=
conjoints[Jacques]=Lucette
conjoints[Jean]=
conjoints[Paul]=Virginie
conjoints[Pierre]=Gisèle
clés[0]=Jacques
clés[1]=Jean
clés[2]=Paul
clés[3]=Pierre
valeurs[0]=Lucette
valeurs[1]=
valeurs[2]=Virginie
valeurs[3]=Gisèle
La clé [Jacques] existe associée à la valeur [Lucette]
La clé [Lucette] n'existe pas
La clé [Jean] existe associée à la valeur []
Nombre d'éléments du dictionnaire : 3
conjoints[Jacques]=Lucette
conjoints[Paul]=Virginie
conjoints[Pierre]=Gisèle

توضیحات

کد بالا، آنچه را که قبلاً برای یک آرایه ساده دیدیم، برای یک فرهنگ لغت اعمال می‌کند. ما فقط در مورد ویژگی‌های جدید توضیح می‌دهیم:

  • خط ۱۳: تابع ksort (ترتیب کلید) یک دیکشنری را به ترتیب طبیعی کلیدها مرتب می‌کند.
  • خط ۲۱: تابع array_keys($dictionnaire) فهرست کلیدهای دیکشنری را به صورت آرایه بازمی‌گرداند
  • خط ۲۶: تابع array_values($dictionnaire) لیست مقادیر دیکشنری را به صورت آرایه بازمی‌گرداند
  • خط ۴۷: تابع isset($variable) اگر متغیر $variable تعریف شده باشد مقدار true و در غیر این صورت مقدار false را برمی‌گرداند.
  • خط ۳۶: تابع unset($variable) متغیر $variable را حذف می‌کند.

3.3.3. آرایه‌های چندبعدی (exemple_06)


<?php

// جدول‌های چندبعدی استاندارد
// ابتدایی‌سازی
$multi = array(array(0, 1, 2), array(10, 11, 12, 13), array(20, 21, 22, 23, 24));
//تکرار
for ($i1 = 0; $i1 < count($multi); $i1++)
  for ($i2 = 0; $i2 < count($multi[$i1]); $i2++)
    print "multi[$i1][$i2]=" . $multi[$i1][$i2] . "\n";
// فرهنگ‌های چندبعدی
// ابتدایی‌سازی
$multi = array("zéro" => array(0, 1, 2), "un" => array(10, 11, 12, 13), "deux" => array(20, 21, 22, 23, 24));
// تکرار
foreach ($multi as $clé => $valeur)
  for ($i2 = 0; $i2 < count($valeur); $i2++)
    print "multi[$clé][$i2]=" . $multi[$clé][$i2] . "\n";
?>

نتایج:

multi[0][0]=0
multi[0][1]=1
multi[0][2]=2
multi[1][0]=10
multi[1][1]=11
multi[1][2]=12
multi[1][3]=13
multi[2][0]=20
multi[2][1]=21
multi[2][2]=22
multi[2][3]=23
multi[2][4]=24
multi[zéro][0]=0
multi[zéro][1]=1
multi[zéro][2]=2
multi[un][0]=10
multi[un][1]=11
multi[un][2]=12
multi[un][3]=13
multi[deux][0]=20
multi[deux][1]=21
multi[deux][2]=22
multi[deux][3]=23
multi[deux][4]=24

توضیحات

  • خط ۵: عناصر آرایه $multi خودشان آرایه‌اند
  • خط ۱۲: آرایه $multi به یک دیکشنری (clé,valeur) تبدیل می‌شود که در آن هر valeur یک آرایه است

3.3.4. ارتباطات بین رشته‌ها و آرایه‌ها (exemple_07)


<?php

// تبدیل رشته به آرایه
$chaine = "1:2:3:4";
$tab = explode(":", $chaine);

// پیمایش آرایه
print "tab a " . count($tab) . " éléments\n";
for ($i = 0; $i < count($tab); $i++)
  print "tab[$i]=$tab[$i]\n";

// آرایه به رشته
$chaine2 = implode(":", $tab);
print "chaine2=$chaine2\n";

//بیایید یک فیلد خالی اضافه کنیم
$chaine.=":";
print "chaîne=$chaine\n";
$tab = explode(":", $chaine);

// حلقه روی آرایه
print "tab a " . count($tab) . " éléments\n";
for ($i = 0; $i < count($tab); $i++)
  print "tab[$i]=$tab[$i]\n"; // ما اکنون ۵ عنصر داریم که عنصر آخر خالی است
  
//بیایید یک فیلد خالی دیگر اضافه کنیم
$chaine.=":";
print "chaîne=$chaine\n";
$tab = explode(":", $chaine);

// تکرار در آرایه
print "tab a " . count($tab) . " éléments\n";
for ($i = 0; $i < count($tab); $i++)
  print "tab[$i]=$tab[$i]\n"; //اکنون ۶ عنصر داریم که دو مورد آخر آن‌ها خالی هستند
?>

نتایج:

tab a 4 éléments
tab[0]=1
tab[1]=2
tab[2]=3
tab[3]=4
chaine2=1:2:3:4
chaîne=1:2:3:4:
tab a 5 éléments
tab[0]=1
tab[1]=2
tab[2]=3
tab[3]=4
tab[4]=
chaîne=1:2:3:4::
tab a 6 éléments
tab[0]=1
tab[1]=2
tab[2]=3
tab[3]=4
tab[4]=
tab[5]=

توضیحات

  • خط ۵: تابع explode($séparateur,$chaine) فیلدهای $chaine را که با $séparateur از هم جدا شده‌اند، بازیابی می‌کند. بنابراین، explode(&quot;:&quot;, $chaine) عناصر $chaine را که با رشته ":" از هم جدا شده‌اند، به صورت یک آرایه بازگردانده می‌کند.
  • تابع implode ($séparateur, $tableau) عملیات معکوس تابع explode را انجام می‌دهد. این تابع یک رشته را بازمی‌گرداند که شامل عناصر $tableau است و توسط $séparateur از هم جدا شده‌اند.

3.4. رشته‌ها

3.4.1. نشانه‌گذاری (exemple_08)


<?php

// نمایش رشته
$chaine1 = "un";
$chaine2 = 'un';
print "[$chaine1,$chaine2]\n";
?>

نتایج:

[un,un]

3.4.2. مقایسه (exemple_09)


<?php

// آزمایش‌های مقایسهٔ رشته‌ای
compare("abcd", "abcd");
compare("", "");
compare("1", "");
exit;

function compare($chaine1, $chaine2) {
  //رشته‌ی1 و رشته‌ی2 را مقایسه می‌کند
  if ($chaine1 == $chaine2)
    print "[$chaine1] est égal à [$chaine2]\n";
  else
    print "[$chaine1] est différent de [$chaine2]\n";
}

?>

نتایج:

1
2
3
[abcd] est égal à [abcd]
[] est égal à []
[1] est différent de []

3.5. بیان‌های منظم (exemple_10)


<?php

// بیان‌های منظم در PHP
//استخراج فیلدهای مختلف از یک رشته

//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده باشد
// ما فقط می‌خواهیم دنبالهٔ ارقام را استخراج کنیم
$modèle = "/(\d+)/";
//ما رشته را با الگو مقایسه می‌کنیم
compare($modèle, "xyz1234abcd");
compare($modèle, "12 34");
compare($modèle, "abcd");

//الگو: دنباله‌ای از ارقام که توسط هر کاراکتری احاطه شده است
// ما می‌خواهیم دنبالهٔ ارقام و همچنین فیلدهای بلافاصله قبل و بعد از آن را
$modèle = "/^(.*?)(\d+)(.*?)$/";
// ما رشته را با الگو مطابقت می‌دهیم
compare($modèle, "xyz1234abcd");
compare($modèle, "12 34");
compare($modèle, "abcd");

//الگو – یک تاریخ در قالب dd/mm/yy
$modèle = "/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/";
compare($modèle, "10/05/97");
compare($modèle, "  04/04/01  ");
compare($modèle, "5/1/01");

//الگو – یک عدد اعشاری
$modèle = "/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/";
compare($modèle, "187.8");
compare($modèle, "-0.6");
compare($modèle, "4");
compare($modèle, ".6");
compare($modèle, "4.");
compare($modèle, " + 4");

//پایان
exit;

// --------------------------------------------------------------------------
function compare($modèle, $chaîne) {
  //رشته $chaîne را با قالب $modèle مقایسه می‌کند
  // رشته با قالب مقایسه می‌شود
  $correspond = preg_match($modèle, $chaîne, $champs);
  // نمایش نتایج
  print "\nRésultats($modèle,$chaîne)\n";
  if ($correspond) {
    for ($i = 0; $i < count($champs); $i++)
      print "champs[$i]=$champs[$i]\n";
  } else
    print "La chaîne [$chaîne] ne correspond pas au modèle [$modèle]\n";
}
?>

نتایج:

Résultats(/(\d+)/,xyz1234abcd)
champs[0]=1234
champs[1]=1234

Résultats(/(\d+)/,12 34)
champs[0]=12
champs[1]=12

Résultats(/(\d+)/,abcd)
La chaîne [abcd] ne correspond pas au modèle [/(\d+)/]

Résultats(/^(.*?)(\d+)(.*?)$/,xyz1234abcd)
champs[0]=xyz1234abcd
champs[1]=xyz
champs[2]=1234
champs[3]=abcd

Résultats(/^(.*?)(\d+)(.*?)$/,12 34)
champs[0]=12 34
champs[1]=
champs[2]=12
champs[3]= 34

Résultats(/^(.*?)(\d+)(.*?)$/,abcd)
La chaîne [abcd] ne correspond pas au modèle [/^(.*?)(\d+)(.*?)$/]

Résultats(/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/,10/05/97)
champs[0]=10/05/97
champs[1]=10
champs[2]=05
champs[3]=97

Résultats(/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/,  04/04/01  )
champs[0]=  04/04/01  
champs[1]=04
champs[2]=04
champs[3]=01

Résultats(/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/,5/1/01)
La chaîne [5/1/01] ne correspond pas au modèle [/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/]

Résultats(/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/,187.8)
champs[0]=187.8
champs[1]=
champs[2]=187.8

Résultats(/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/,-0.6)
champs[0]=-0.6
champs[1]=-
champs[2]=0.6

Résultats(/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/,4)
champs[0]=4
champs[1]=
champs[2]=4

Résultats(/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/,.6)
champs[0]=.6
champs[1]=
champs[2]=.6

Résultats(/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/,4.)
champs[0]=4.
champs[1]=
champs[2]=4.

Résultats(/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/, + 4)
champs[0]= + 4
champs[1]=+
champs[2]=4

توضیحات

  • خطوط ۳–۴: در اینجا از عبارت‌های منظم برای استخراج فیلدهای مختلف از یک رشته استفاده می‌کنیم. عبارت‌های منظم به ما امکان می‌دهند محدودیت‌های تابع implode را برطرف کنیم. اصل کار مقایسه یک رشته با رشته‌ای دیگر به نام modèle با استفاده از تابع preg_match است:

$correspond = preg_match($modèle, $chaîne, $champs);

تابع preg_match یک مقدار بولی را بازمی‌گرداند که نشان می‌دهد آیا modèle را می‌توان در chaîne یافت یا خیر. در این صورت، $champs[0] زیر رشته‌ای را که با قالب مطابقت دارد، نشان می‌دهد. علاوه بر این، اگر قالب حاوی زیرقالب‌ها در پرانتز باشد، $champs[1] بخشی از $chaîne است که به اولین زیرقالب مربوط می‌شود، $champs[2] بخشی از $chaîne است که به زیرالگوی دوم مربوط می‌شود، و به همین ترتیب...

بیایید اولین مثال را بررسی کنیم. الگو در خط ۸ تعریف شده است: این الگو نشان‌دهنده یک دنباله از یک یا چند رقم (+) (\d) است که می‌تواند در هر نقطه‌ای از یک رشته قرار گیرد. علاوه بر این، الگو یک زیرالگو را تعریف می‌کند که در داخل پرانتز قرار دارد.

  • خط ۱۰: الگوی /(\d+)/ (یک دنباله از یک یا چند رقم در هر جای رشته) با رشته «xyz1234abcd» مطابقت داده می‌شود. می‌توانیم ببینیم که زیررشته 1234 با الگو مطابقت دارد. بنابراین داریم $champs[0] برابر با «1234». علاوه بر این، الگو حاوی زیرالگوهایی در داخل پرانتز است. بنابراین خواهیم داشت $champs[1] = "1234".
  • خط ۱۱: الگوی /(\d+)/ با رشته "12 34" مقایسه می‌شود. می‌توان دید که زیررشته‌های 12 و 34 با الگو مطابقت دارند. مقایسه در اولین زیررشته‌ای که با الگو مطابقت دارد متوقف می‌شود. بنابراین داریم $champs[0]=12 و $champs[1]=12.
  • خط ۱۲: الگوی /(\d+)/ با رشته "abcd" مقایسه می‌شود. تطابقی یافت نمی‌شود.

بیایید الگوهای مورد استفاده در بقیه کد را توضیح دهیم:


$modèle = "/^(.*?)(\d+)(.*?)$/";

شروع رشته (^)، به دنبال آن صفر یا چند کاراکتر دلخواه (*) (.), به دنبال آن یک یا چند رقم (+)، به دنبال آن صفر یا چند کاراکتر دلخواه (*) (.). الگوی (.*) صفر یا تعداد بیشتری کاراکتر دلخواه را مطابقت می‌دهد. چنین الگویی با هر رشته‌ای مطابقت خواهد داشت. بنابراین، الگوی /^(.*)(\d+)(.*)$/ هرگز مطابقت داده نخواهد شد زیرا زیرالگوی اول (.*) کل رشته را در بر می‌گیرد. الگوی (.*?)(\d+) صفر یا تعداد بیشتری از هر کاراکتر را تا زیرالگوی بعدی (?)، در این مورد \d+، مطابقت می‌دهد. در نتیجه، اعداد دیگر توسط الگوی (.*) مطابقت داده نمی‌شوند. بنابراین، الگوی بالا [début de chaîne (^), une suite de caractères quelconques (.*?), une suite d'un ou plusieurs chiffres (\d+), une suite de caractères quelconques (.*?), la fin de la chaîne ($)] را مطابقت می‌دهد.


$modèle = "/^\s*(\d\d)\/(\d\d)\/(\d\d)\s*$/";

با [début de chaîne (^), 2 chiffres (\d\d), le caractère / (\/), 2 chiffres, /, 2 chiffres, une suite de 0 ou plusieurs espaces (\s*), la fin de chaîne ($)] مطابقت دارد


$modèle = "/^\s*([+|-]?)\s*(\d+\.\d*|\.\d+|\d+)\s*/";

[début de chaîne (^), 0 ou plusieurs espaces (\s*), un signe + ou - [+|-] présent 0 ou 1 fois (?), une suite de 0 ou plusieurs espaces (\s*), 1 ou plusieurs chiffres suivis d'un point décimal suivi de zéro ou plusieurs chiffres (\d+\.\d*) ou (|) un point décimal (\.) suivi d'un ou plusieurs chiffres (\d+) ou (|) un ou plusieurs chiffres (\d+), une suite de 0 ou plusieurs espaces (\s*)].

3.6. حالت ارسال پارامتر تابع (exemple_11)


<?php

// حالت ارسال پارامتر

function f(&$i, $j) {
  // $i به صورت ارجاعی دریافت خواهد شد
  // $j به صورت ارجاعی ارسال خواهد شد
  $i++;
  $j++;
  print "f[i,j]=[$i,$j]\n";
}

// ----------------------------------------آزمایش‌ها
$i = 0;
$j = 0;
// $i و $j با مقدار ارسال می‌شوند
f($i, $j);
print "test[i,j]=[$i,$j]\n";
?>

نتایج:

f[i,j]=[1,1]
test[i,j]=[1,0]

توضیحات

کد بالا دو روش ارسال پارامتر به یک تابع را نشان می‌دهد. بیایید مثال زیر را در نظر بگیریم:

1
2
3
4
5
6
7
function f(&$a,$b){

}

// برنامهٔ اصلی
$i=10; $j=20;
f($i,$j);
  • خط ۱: پارامترهای اسمی $a و $b را برای تابع f تعریف می‌کند. این تابع این دو پارامتر اسمی را پردازش کرده و یک نتیجه را بازمی‌گرداند.
  • خط ۷: تابع f را با دو پارامتر حقیقی، $i و $j، فراخوانی می‌کند. ماتریس تطبیق بین پارامترهای صوری ($a, $b) و پارامترهای حقیقی ($i, $j) توسط خط ۷ تعریف می‌شود.
  • &$a: نماد & نشان می‌دهد که پارامتر شکلی $a مقدار آدرس پارامتر حقیقی $i را خواهد گرفت. به عبارت دیگر، $a و $i دو اشاره به یک مکان حافظه یکسان هستند. دستکاری پارامتر صوری $a معادل دستکاری پارامتر حقیقی $i است. این موضوع با اجرای کد نشان داده می‌شود. این حالت ارسال برای پارامترهای خروجی و مجموعه‌های داده بزرگ مانند آرایه‌ها و دیکشنری‌ها مناسب است. این حالت ارسال به عنوان «ارسال ارجاعی» (pass-by-reference) شناخته می‌شود.
  • $b: پارامتر فرمال $b مقدار پارامتر حقیقی $j را به خود اختصاص خواهد داد. این یک ارسال به صورت مقدار است. پارامترهای اسمی و حقیقی دو متغیر متفاوت هستند. دستکاری پارامتر اسمی $b هیچ تأثیری بر پارامتر حقیقی $j ندارد. این موضوع با اجرای کد نشان داده می‌شود. این حالت ارسال برای پارامترهای ورودی مناسب است.
  • تابع échange را در نظر بگیرید که دو پارامتر اسمی دارد: $a و $b. این تابع مقادیر این دو پارامتر را با هم جابجا می‌کند. بنابراین، در هنگام فراخوانی swap ($i, $j)، کد فراخواننده انتظار دارد که مقادیر دو پارامتر حقیقی با هم جابجا شوند. از این رو، این‌ها پارامترهای خروجی هستند (مقادیرشان تغییر می‌کند). بنابراین، به این صورت می‌نویسیم:
function échange(&$a,&$b){....}

3.7. نتایج بازگشتی یک تابع (exemple_12)


<?php

//نتایج بازگردانده‌شده توسط یک تابع
//یک تابع می‌تواند مقادیر متعددی را در یک آرایه بازگرداند
list($res1, $res2, $res3) = f1(10);
print "[$res1,$res2,$res3]\n";
$res = f1(10);
for ($i = 0; $i < count($res); $i++)
  print "res[$i]=$res[$i]\n";

//یک تابع می‌تواند یک شیء شبه‌را برگرداند
$res = f2(10);
print "[$res->res1,$res->res2,$res->res3]\n";

//پایان
exit;

// تابع f1
function f1($valeur) {
  //یک آرایه را بازمی‌گرداند ($valeur+1,$aleur+2,$baleur+3)
  return array($valeur + 1, $valeur + 2, $valeur + 3);
}

// تابع f2
function f2($valeur) {
  //یک شیٔ شبه‌شیء را بازمی‌گرداند ($valeur+1,$aleur+2,$baleur+3)
  $res->res1 = $valeur + 1;
  ;
  $res->res2 = $valeur + 2;
  $res->res3 = $valeur + 3;
  //شیء را بازمی‌گرداند
  return $res;
}

?>

نتایج

1
2
3
4
5
[11,12,13]
res[0]=11
res[1]=12
res[2]=13
[11,12,13]

توضیحات

  • برنامه قبلی نشان می‌دهد که تابع PHP می‌تواند به جای یک نتیجهٔ منفرد، مجموعه‌ای از نتایج را در قالب یک آرایه یا یک شیء بازگرداند. مفهوم شیء در ادامه با جزئیات بیشتری توضیح داده شده است
  • خطوط ۱۹–۲۲: تابع f1 مقادیر چندگانه را به صورت یک آرایه بازمی‌گرداند
  • خطوط ۲۵–۳۳: تابع f2 مقادیر چندگانه را به شکل یک شیء بازمی‌گرداند

3.8. فایل‌های متنی (exemple_13)


<?php

//پردازش متوالی یک فایل متنی
// این شامل مجموعه‌ای از خطوط در قالب login:pwd:uid:gid:infos:dir:shell است
// هر خط در یک دیکشنری به شکل login => uid:gid:infos:dir:shell ذخیره می‌شود

//نام فایل تنظیم می‌شود
$INFOS = "infos.txt";

// آن را برای نوشتن باز می‌کنیم
if (!$fic = fopen($INFOS, "w")) {
  print "Erreur d'ouverture du fichier $INFOS en écriture\n";
  exit;
}

// ما محتوای دلخواه تولید می‌کنیم
for ($i = 0; $i < 100; $i++)
  fputs($fic, "login$i:pwd$i:uid$i:gid$i:infos$i:dir$i:shell$i\n");
// بستن فایل
fclose($fic);

// سوءاستفاده کنید – fgets نشانگر پایان خط را حفظ می‌کند
// این اطمینان را می‌دهد که هنگام خواندن یک خط خالی، یک رشتهٔ خالی بازگردانده نشود
// فایل را برای نوشتن باز کنید
if (!$fic = fopen($INFOS, "r")) {
  print "Erreur d'ouverture du fichier $INFOS en lecture\n";
  exit;
}
while ($ligne = fgets($fic, 1000)) {
  // کاراکتر پایان خط در صورت وجود حذف می‌شود
  $ligne = cutNewLineChar($ligne);
  // ما خط را در یک آرایه قرار می‌دهیم
  $infos = explode(":", $ligne);
  // بازیابی ورود
  $login = array_shift($infos);
  //رمز عبور نادیده گرفته می‌شود
  array_shift($infos);
  // یک مدخل در فرهنگ لغت ایجاد می‌کند
  $dico[$login] = $infos;
}
// آن را ببندید
fclose($fic);

// از دیکشنری سوءاستفاده کنید
afficheInfos($dico, "login10");
afficheInfos($dico, "X");

//پایان
exit;

// --------------------------------------------------------------------------
function afficheInfos($dico, $clé) {
  //مقدار مرتبط با کلید را در فرهنگ لغت $dico نمایش می‌دهد اگر وجود داشته باشد
  if (isset($dico[$clé])) {
    //مقدار وجود دارد – آیا آرایه است؟
    $valeur = $dico[$clé];
    if (is_array($valeur)) {
      print "[$clé," . join(":", $valeur) . "]\n";
    } else {
      // $valeur یک آرایه نیست
      print "[$clé,$valeur]\n";
    }
  } else {
    // $clé کلید در فرهنگ لغت $dico نیست
    print "la clé [$clé] n'existe pas\n";
  }
}

// --------------------------------------------------------------------------
function cutNewLinechar($ligne) {
  // علامت پایان خط برای $ligne در صورت وجود حذف می‌شود
  $L = strlen($ligne);  //طول خط
  while (substr($ligne, $L - 1, 1) == "\n" or substr($ligne, $L - 1, 1) == "\r") {
    $ligne = substr($ligne, 0, $L - 1);
    $L--;
  }
  // پایان
  return($ligne);
}

?>

فایل infos.txt:

login0:pwd0:uid0:gid0:infos0:dir0:shell0
login1:pwd1:uid1:gid1:infos1:dir1:shell1
login2:pwd2:uid2:gid2:infos2:dir2:shell2
...
login98:pwd98:uid98:gid98:infos98:dir98:shell98
login99:pwd99:uid99:gid99:infos99:dir99:shell99

نتایج:

[login10,uid10:gid10:infos10:dir10:shell10]
la clé [X] n'existe pas

نظرات

  • خط ۱۱: fopen(nom_fichier, "w") فایل nom_fichier را برای نوشتن (w=write) باز می‌کند. اگر فایل وجود نداشته باشد، ایجاد می‌شود. اگر وجود داشته باشد، محتویات آن پاک می‌شود. اگر ایجاد با موفقیت انجام نشود، fopen مقدار false را برمی‌گرداند. در عبارت if (!$fic = fopen($INFOS, "w")) {…}, دو عملیات متوالی وجود دارد: ۱) $fic = fopen(..) ۲) if (!$fic) {...}
  • خط ۱۸: fputs($fic, $chaîne) مقدار chaîne را در فایل $fic می‌نویسد.
  • خط ۲۰: fclose($fic) فایل $fic را می‌بندد.
  • خط ۲۵: fopen(nom_fichier, "r") فایل nom_fichier را برای خواندن (r=read) باز می‌کند. اگر باز کردن فایل ناموفق باشد (فایل وجود ندارد)، fopen مقداری از false را برمی‌گرداند.
  • خط ۲۹: تابع fgets($fic, 1000) خط بعدی را از فایل می‌خواند، محدود به ۱۰۰۰ کاراکتر. در حلقه while ($ligne = fgets($fic, 1000)) {…}, دو عملیات متوالی وجود دارد: 1) $ligne = fgets(...) ۲) while ( ! $ligne). به محض خوانده شدن آخرین کاراکتر فایل، تابع fgets یک رشته خالی برمی‌گرداند و حلقه while خاتمه می‌یابد.
  • خط ۳۱: تابع fgets یک خط متن را، شامل کاراکتر پایان خط، می‌خواند. تابع cutNewLineChar در خطوط ۷۰–۷۹ هر کاراکتر پایان خط را حذف می‌کند.
  • خط ۷۲: تابع strlen($chaîne) تعداد کاراکترهای $chaîne را برمی‌گرداند.
  • خط ۷۳: تابع substr($ligne, $position, $taille) تعداد $taille کاراکتر را از $ligne، از موقعیت کاراکتر با شماره $position بازمی‌گرداند، که در آن کاراکتر اول شماره 0 را دارد. در سیستم‌عامل ویندوز، نشانگر پایان خط «\r\n» است. در سیستم‌عامل یونیکس، این رشته «\n» است.
  • خط ۳۵: تابع array_shift($tableau) اولین عنصر را از $tableau حذف کرده و آن را به عنوان نتیجه بازمی‌گرداند.
  • خط ۳۷: تابع array_shift($tableau) فراخوانی می‌شود، اما نتیجه آن نادیده گرفته می‌شود
  • خط ۵۷: تابع is_array($variable) اگر $variable یک آرایه باشد، true را بازمی‌گرداند و در غیر این صورت، false را بازمی‌گرداند.
  • خط ۵۸: تابع join همان کاری را انجام می‌دهد که تابع implode پیش‌تر انجام داده بود