Sabitlər

Proqrmalaşdırma zamanı elə parametrlər olur ki, proqramın yerinə yetirilməsi zamanı onların qiyməti dəyişmir. Bu, riyaziyyata aid sabit ədədlər, direktoriyanın, faylın yerləşdiyi yerin yolu, parollar və s. ola bilər. Məhz belə məqsədlər üçün PHP-də xüsusi konstruksiya, sabitlər nəzərdə tutulub (ing:constant“, rus: константа).

Sabitlərin dəyişəndən fərqi ondadır ki, sabitlərə dəyəri proqramın yerinə yetirilməsi zamanı yalnız bir dəfə mənimsətmək olar və onların identifikatorlarının qarşısında $ işarəsi yazılmır. Məsələn:

// Qəbul edək ki, əvvəldən PI sabiti 3.1416... kimi təyin edilib
$a = 2.34 * sin(3 * PI / 8) + 5;
// использование константы
echo "Bu PI ədədidir";
// "Bu PI ədədidir" çap olunacaq
echo "Bu ". PI . " ədədidir";
// "Bu 3.1416... ədədidir" çap olunacaq

Əslində, sabitlərin adının solunda “dollar” işarəsinin yazılmaması bir tərəfdən rahatlıqdır. Digər tərəfdən isə göründüyü kimi, bu həm də çatışmamazlıqdır, artıq sabitləri yazı sətrinin daxilində birbaşa istifadə edə bilmirik. Sabitlərin adları reqistrə həssasdır və buna görə də məsələn, PIpi sabitləri tam fərqli iki sabitlərdir.

PHP-də interpretatorun özü tərəfindən elan edilmiş sabitlər və proqramçı tətəfindən təyin edilən sabitlər var.

Elan edilmiş sabitlər

PHP-də interpretatorun özü tərəfindən elan edilmiş bir neçə sabitlər var.

  • __FILE__  – hal hazırda yerinə yetirilən proqramın yerləşdiyi faylın adını saxlayır
  • __LINE__ – interpretatorun hal hazırda yerinə yetirdiyi komandanın yerləşdiyi sətrin sıra nömrəsi. Bu, proqramın yerinə yetirilməsi zamanı hər dəfə dəyişən, özünəməxsus sabitdir. (Həmçinin, idarəetməni digər fayla ötürəndə __FILE__ sabiti də dəyişir)
  • __FUNCTION__ – işə salınmış cari funksiyanın adı
  • __CLASS__ – cari klassın adı
  • PHP_VERSION – PHP interpretatorun versiyası
  • PHP_OS – hal-hazırda PHP-in işlədiyi ƏS-in adı
  • PHP_OS – hal-hazırda PHP-in işlədiyi ƏS-ə uyğun sətrin sonunu bildirən simvol: Linux-da \n, Windows-da \r\n, Mac OS X-də \n\r kimi müəyyən olunur.
  • true və ya TRUE – bu sabit məntiqi “doğru” dəyərini saxlayır
  • false və ya FALSE – məntiqi “yanlış” dəyərini saxlayır
  • null və ya NULLnull dəyərini saxlayır

Qeyd edək ki, true, falsenull sabitlərinin böyük hərflərlə də  – TRUE, FALSENULL kimi yazılmasına icazə verilir. Ancaq, gələcəkdə baxacağımız PSR-2 standartı bunların kiçik hərflərlə yazılmasını tələb edir.

Sabitlərin təyin edilməsi

PHP-də özümüzün, xüsusi sabitlərini yaratmaq üçün define() konstruksiyasından istifadə edilir və bu konstruksiya aşağıdakı kimi təyin edilib:

void define(string $name, string $value, bool $case_sen = true);

Göründüyü kimi, define() $name-də göndərilmiş ada uyğun $value qiyməti mənimsədilmiş yeni sabit müəyyən edir. Vacib olmayan $case_sen parametri true olarsa irəlidə proqramın gedişatında sabitin adının reqistrləri də nəzərə alınır, əks halda nəzər alınmır. Sabitin silinməsi, ləğv edilməsi və yenidən təyin edilməsinə icazə verilmir. Nümunə:

define("pi", 3.14);
define("str", "Test string");
echo sin(pi / 4);
echo str;

Sabitin yaradılması zamanı adının dırnaq işarələri arasında yazılmasına fikir vermək lazımdır. Həmçinin, eyni adda ikinci sabiti təyin etməyin mümkün olmadığını nəzərdən qaçırmaq olmaz, bu halda proqramın yerinə yetirlməsi zamanı səhv çıxacaq.

Sabitin mövcudluğunun yoxlanılması

PHP-də həmçinin verilmiş adda sabitin mövcud olmamasını və ya təyin edilib edilməməsini yoxlayan funksiya mövcuddur:

bool defined(string $name);

$name adında sabit mövcuddursa true qaytarır.

Dinamik təyin edilmiş sabitlər

Hərdən, sabitləri dinamik olaraq proqramın yerinə yetirilməsi zamanı təyin etmək lazım gəlir. Bu zaman onların adını əvvəlcədən müəyyən etmək olmadığından proqramın mətnində əvvəldən onları yazmaq olmur. Belə hallarda sabitin qiymətini oxumaq üçün constant() funksiyasından istifadə edilir.

mixed constant(string $name)

Funksiya $name adlı sabitin dəyərini qaytarır. Göstərilmiş adda sabit mövcud deyilsə funksiya xəbərdalıq generasiya edir.

Növbəti nümunədə mt_rand() funksiyası ilə $index dəyişəninə 1-dən 10-a kimi təsadüfi bir rəqəm mənimsədilir və ondan sabitin formalaşdırılmasında istifadə edilir. Nəticədə hər dəfə proqram işə salınarkən sabitin adı mümkün 10 addan biri ola bilər. Belə sabitin dəyərini yalnız constant() funksiyası ilə əldə etmə olar.

<?php
  // 1-dən 10-a kimi təsadüfi bir ədəd generasiya edirik
  $index = mt_rand(1, 10);   // sabitin adı formalaşdırılır
  $name = "VALUE{$index}";  
  // Dinamik adlı sabiti təyin edirik
  define($name, 1);  
  echo constant($name); 
?>

Mənimsətmə operatoru

Mənimsətmə – proqramlaşdırmada dəyişənlər ilə onların qiymətləri arasında əlaqələri dinamik olaraq dəyişməyə imkan verən mexanizmdir. Aydındır ki, qiymətin dəyişdirilməsi mənimsətmə əməliyyatının nəticəsidir və bir çox proqramlaşdırma dillərində bu əməliyyatın özü də müəyyən nəticə (adətən, mənimsədilən qiymətin eynisini) qaytarır. Fiziki olaraq isə mənimsətmə kompüterin yaddaşı və ya prosessorunun reqistrlərinə yazmaq və ya yenidən yazmaqdan ibarətdir.

Əvvəlki mövzularda bu operatorla rastlaşmışıq və PHP-də onun yazılış forması bərabər işarəsi – “=” kimidir. Sadə mənimsətmə əməliyyatının ümumi sintaksisi $dəyişənin_adı = qiymət; formasındadır. Əslində mənimsətmə əməliyyatının yazılış simvolunun seçilməsi proqramlaşdırma dillərinin yaradıcıları arasında çox mübahisələrə səbəb olur. Belə bir fikir var ki, = işarəsindən mənimsətməni işarələmək üçün istifadə edilməsi proqramlaşdırma dilinə iki operandın müqayisəsi üçün əlavə == işarəsini gətirməyə məcburiyyət yaradır və bu, proqramçıları dolaşığa salır, nəticədə mənimsətmə operatoru müqayisə operatoru ilə səhf salınır.

Bəzi dillərdə, məsələn C dilində if (a == b) { ... } əvəzinə if (a = b) { ... } yazsaq, yəni bilməyərəkdən = işarəsinin birini buraxmış olsaq kompilyator ən azı xəbərdarlıq göstərəcək. PHP-də isə məsələ fərqlidir. Bunu özünüzün də yoxlamağınız məsləhətdir.

$a = 0; $b = 0;
if($a = $b) echo "a və b eynidir";
else  echo "a və b fərqlidir";

İnterpretator heç nə hiss etdirməyəcək və proqram əminliklə “a və b eynidir” olduğunu bildirəcək. Göründüyü kimi proqram heç də düzgün nəticəni vermir. Buna səbəb $a = $b yazılışının məsələn, $a + $b kimi bir ifadə olmasıdır və bu yazılışın nəticəsi mənimsətmə operatorunun sağ tərəfinin qiymətinə, bizim halda 1-ə bərabərdir. Buna görə də belə məsələlərdə diqqətli olmaq mütləqdir.

PHP-də dəyişənlər. callable (əks əlaqə funksiyaları)

PHP-də bəzi funksiyalara arqument kimi başqa funksiyalar ötürülə bilər. Həmən bu ötürülə bilən funksiyalara əks əlaqə funksiyaları deyilir. Növbəti mövzularda belə funksiyaların necə yaradıldığı göstəriləcək. Beləliklə, funksiya özünü dəyişən kimi aparır və PHP 5.4 versiyasından daxil edilən bu tip callable adlanır.

PHP-də dəyişənlər. NULL (xüsusi işarələmə)

Dəyişəni xüsusi işarələmək üçün ona xüsusi null sabitini mənimsətmək olar. Bu sabitin tipi xüsusidir və null adlanır. Bu ayrıca, xüsusi tipdir və PHP-dəki xüsusi gettype() funksiyası null-dəyişənlər üçün null sözü qaytarır.

Bu dəyişənin adını böyük hərflərlə də NULL kimi yazmaq mümkündür, ancaq gələcəkdə baxacağımız PSR-2 standartı belə yazmağı məsləhət görmür.

PHP-də dəyişənlər. Boolean (Bul tipi)

Boolean, bul tipi dedikdə informatikada dəyişənlərinin iki mümkün dəyərdən – doğru (true) və yalan (false) – birini qəbul edə bilən primitiv tipi nəzərdə tutulur. Bu tipli dəyilşənlərə həmçinin bul dəyişənləri deylir. Ümumiyyətlə istənilən sıfır olmayan ədəd və ya boş olmayan sətir, həmçinin true açar sözü məntiqi doğru true kimi qəbul edilir. Əksinə, sıfır rəqəmi, boş sətir mənimsədilmiş dəyişən və false açar sözü məntiqi yalan – false kimi qəbul edilir. Beləliklə, istənilən boş olmayan, sıfırla nəticələnməyən ifadələr, xüsusi halda dəyişənin qiyməti məntiqi doğru qəbul edilir. PHP-də truefalse sabitləri mövcuddur və onlardan məntiqi ifadələrdə proqramın məntiqindən asılı olaraq istifadə etmək mümkündür.

Bul dəyişənlər üzərində riyazi əməliyyatlar zamanı onlar adi integer dəyişənlərə çevrilir. Daha dəqiq desək, false 0 kimi, true 1 kimi qəbul edilir. Ancaq, belə vəziyyətdə maraqlı bir halla da qarşılaşmaq olar. Növbəti mövzularda araşdıracağımız, dəyişənin dəyərini vahid qədər artırıb, azaldan ++-- operatorları bul dəyişənləri ilə gözlənilən nəticəni vermir, işləmir.

<?php
    // məntiq dəyişəni üzərində inkrement və dekrement
    $bool_var = true;
    echo "bool_var: $bool_var<br/>"
    $bool_var++;
    echo "bool_var: $bool_var<br/>"
?>

Bu proqramın nəticəsi iki dəfə 1 rəqəmini çap edir və göründüyü kimi, ++ operatoru bu halda “işləmir”.

PHP-də dəyişənlər. Resource (resurslar)

Resource PHP-in xüsusi formada istifadə etdiyi hər hansı resursdur. Resursa nümunə olaraq faylın deskriptorunu göstərən dəyişəni göstərmək olar. Bu dəyişən PHP-yə növbəti addımlarda fayl üzərində hər hansı əməliyyat zamanı hansı faylın üzərində iş görüldüyünü göstərmək üçün istifadə edilir (məsələn, fayldan növbəti sətri oxuyərkən). Digər nümunə kimi GD kitaxanasına aid imageCreate() funksiyasını göstərmək olar. Bu funksiya əməli yaddaşda verilmiş ölçüdə “boş” şəkil yaradır və onun identifikatorunu qaytarır. Bu identifikatordan istifadə edərək gələcəkdə həmən şəkil üzərində manipulyasiyalar məsələn, xət çəkmək, yazı yazmaq və s. etmək və sonda nəticəni PNG və ya JPEG formatında yadda saxlamaq mümkündür.

PHP-də dəyişənlər. Object (obyekt, obyektə istinad)

Obyekt yönümlü proqramlaşdırmanın müəyyən prinsiplərini ödəyən obyektə “istinad” (İngilis dilində “reference“, Rus dilində “ссылка” ). Ayrıca element (obyektin atribut və ya dəyişənləri) və funksiyalarına (obyektin metodları) müraciət üçün -> operatorundan istifadə edildiyini nəzərə almasaq, obyektin daxili strukturu assosiativ massivə bənzəyir. Obyektlər irəlidə daha dərindən izah ediləcək.

Obyektə istinad nə deməkdir? Obyektlərlə işləyərkən bu anlayışı düzgün başa düşmək əsas şərtlərdən biridir. Burada istinad dedikdə obyektin yaddaşda atribut və metodlarının yerləşdiyi adres nəzərdə tutulur. Faktiki olaraq hər hansı dəyilşənə mənimsədərkən və ya metoda arqument kimi ötürmə prosesində obyektin özü iştirak etmir. Onun əvəzinə obyektə istinadlar istifadə edilir. Kobud desək, dəyişəndə obyektə müraciət etməyin üsulu, obyektin “adı” saxlanılır və hər hansı dəyişənə obyekt mənimsədilmiş dəyişən mənimsədilirsə obyektin yaddaşda yeni nüsxəsi yaradılmır, obyektə sadəcə yeni “ad” verilmiş olur.

Yuxarıdakıları nəzərə alaraq göstərmək olar ki, $a = $obj kimi olarsa $a obyektində edilən hər hansı dəyişiklik uyğun olaraq $obj obyektində də həmən dəyişikliyə səbəb olacaq.

PHP-də dəyişənlər. Array (assosiativ massiv)

Assosiativ massiv, elementləri açar=>qiymət cütlüyü şəklində olan bir neçə elementdən ibarət çoxluqdur. Digər proqramlaşdırma dillərində ona həm də heş deyilir, ancaq bu anlayış PHP-yə heç uyğun deyil. => işarəsi açar sözün təyin edilmiş qiymətə uyğunluğunu göstərmək üçün istifadə edilir. Massivin hər elementinə müraciət onun açar sözünün göstərməklə edilir. C dilindən fəqrli olaraq burda arrayın açar sözləri kimi təkcə tam ədədlər yox istənilən sətir tipli dəyişənlər ola bilər. Məsələn, aşağıda yazılanlar PHP üçün normaldır:

<?php
// "0", "surname" və "name" açarlı massiv yaradır
$a = array(
    0 => "Boş sətir",
    "name" => "Tom",
    "surname" => "Hanks",
);
// "Hanks" çap edir
echo $a["surname"];
//element yaradır və ona qiymətini mənimsədir
$a["1"] => "Birinci element";
// mövcud elemntə yeni qiymət mənimsədir
$a["name"] = "Jack";
?>

İrəli gedərək qeyd edə bilərik ki, massivlər array() və ya [] konstruksiyası ilə yaradılır.

PHP-də dəyişənlər. String (sətir tipi)

İstənilən uzunluqda sətirdir. C proqramlaşdırma dilindən fərqli olaraq daxilində həm də null simvollarını saxlaya bilər. Başqa sözlə desək String daxilində yazı olmayan – binary məlumat da saxlamaq mümkündür. Sətir tipinin maksimal uzunluğu 2 qiqabaytdır. Ancaq bu limitə çox nadir hallarda çatmaq olur. Buna səbəb PHP-skriptin istifadə edə biləcək maksimal yaddaş həcminin memory_limit direktivi ilə məhtudlaşdırılmasıdır. Onun əvvəlcədən, susmaya görə təyin edilmiş dəyəri 128 meqabaytdır. Bunları nəzərə alsaq rahatlıqla qeyd etmək olar ki, bir neçə meqabayt həcmli faylın məlumatlarını bir sətir tipli dəyişənə mənimsətmək mümkündür. Buna praktikada tez-tez rast gəlinir. Sətirlə PHP-in standart funsiyaları ilə işləmək çox asandır və hətta onun hər simvoluna ayrılıqda müraciət etmək mümkündür.

PHP-də dəyişənlər. Double (həqiqi ədədlər)

Bunlara sürüşən vergüllü ədədlər deyilir. Ədəbiyyatda və praktikada float, double və ya real kimi də təyin edilir. İki yazılma forması var. Adi yazılış forması cəbrdə yazılış forması ilə eynidir məsələn, 597.5267. Eksponensial yazılış forması isə ədədləri mantissin 5.975267 uyğun 102-a hasili kimi göstərməyə imkan verir. Sıfırdan kiçik ədədlər üçün 10-un üstü mənfi olur. Buna uyğun olaraq 0.00031 ədədini 3.1 × 10-4 kimi göstərmək olar. Beləliklə:

597.5267 => 5.975267×102 => 5.975267e+2
0.00031  => 3.1×10-4      => 3.1e-4

Kompüter proqramlarında yuxarı reqistr simvollarından istifadə etmək imkanı yoxdur, ona görə də ×10 ifadəsi e simvolu şəklində yazılır və ondan sonra 10-un üstündəki qüvvət qeyd edilir. Aşağıdakı misalda $a$b dəyişənlərinin qiymətləri tamamilə eynidir:

<?php
  $a = 597.5267;
  $b = 5.975267e+2;
  $a = 0.00031;
  $b = 3.1e-4;
?>

Sürüşən vergüllü ədədlərin aparat səviyyəsində realizasiyasının ona ayrılan baytlardan və mümkün olan diapazonundan asılı olaraq bir neçə modeli var. Proqramlaşdırma dillərinin əvvəlki versiyalarında sürüşən vergüllü ədədlərin modelini açıq şəkildə göstərmək olurdu. Single (S), Extended (E), Double (D) modellərinə uyğun olaraq 4, 10 və 8 bayt ayrılırdı. Belə variantların olması onunla əlaqəlidir ki, əvvəllər prosessorların daxilində bir qurğu kimi soprosessor yox idi. Soprosessor sürüşən vergüllü ədədlərlə əməliyyatlar yerinə yetrimək – onların realizasiyası üçün lazımdır. Yəni prosessor səviyyəsində yalnız tam ədədlərlə əməliyyat etmək mümkün idi, sürüşən vergüllü ədələrlə isə əməliyyatları dilin kompilyatorunun yaradıcıları özləri nəzərə almalı idilər. Müasir dövrdə demək olar ki, belə problem yoxdur və bütün kompüterlər soprosessorla təchiz olunmuş olur. İstisna yalnız RISC-arxitekturalı superkompüterlər ola bilir. Onların sayı isə məhtuddur.

IBM Blue Gene/P superkomputeri
IBM Blue Gene/P superkomputeri

Məsələnin belə olması ona gətirib çıxarıb ki, sürüşən vergüllü ədədlərin realizasiyasi Double modelini realizasiya edən soprosessor tərəfindən müəyyən edilir və bu modelə 8 bayt ayrılır. Beləliklə, Double modeli uyğun olaraq ±2.23×10-308-dən ±1.79×10308-dək olan aralığı əhatə edir.

İcazə verilən diapazondan kənara çıxılarsa rəqəm əvəzinə sonsuzluğu göstərən INF sabiti çap edilir. Belə ədədlərlə istənilən əməllər də INF nəticəsini verir.

<?php
  echo 6.5e203; // 6.5E+203
  echo 1.8e308; // INF
  echo $var - 1.8e308; // INF
?>

PHP-də INF sabitindən başqa NAN sabiti də var. Bu sabit icazə verilməyən rəqəm mənasında işlədilir. Məsələn, növbəti misalda -1-dən kvadrat kök almaq ifadəsi göstərilib:

<?php
  echo sqrt(-1); // NAN
?>

PHP-də kompleks ədədlərlə işləmək nəzərdə tutulmadığından bu misalda o, icazə verilməyən ədəd – NAN nəticəsini qaytaracaq. INF-də olduğu kimi NAN üzərində də ixtiyari əməliyyatlar elə NAN qaytarır.