Dəyişənin tipinin müəyyən edilməsi və dəyişdirilməsi

Dəyişənin tipinin müəyyən edilməsi

Əvvəlki mövzuda izah edilmiş imkanlardan başqa standarta daxil edilmiş, dəyişənin tipini müəyyən etməyə imkan verən bir neçə funksiya da mövcuddur. Onlardan tez-tez şərti keçid operatorlarında istifadə edilir.

  • is_int($v)$v tam ədəd olarsa true qaytarır
  • is_infinite($v)$v dəyişəninin qiyməti sonsuzluq – INF olarsa true qaytarır
  • is_nan($v)$v dəyişəninin qiyməti icazə verilməyən ədəd – NAN olarsa true qaytarır
  • is_string($v)$v dəyişəni sətir tipli olarsa true qaytarır
  • is_numeric($v)$v dəyişəni ədəd olarsa və ya yalnız rəqəmlər və nöqtədən ibarət sətir tipli dəyişən olarsa true qaytarır. PHP-də daxilində ədəd olan sətir tipli dəyişənlərlə də sadə riyazi əməllər yerinə yetirmək mümkündür. Buna görə də bu funksiyanı is_integer()is_number() funksiyaları ilə birgə istifadə etmək məsləhət görülür.
  • is_bool($v)$v dəyişəninin tipi yalnız və yalnız true və ya false olarsa true qaytarır
  • is_scalar($v)$v dəyişəninin tipi yuxarıda sadalanan tiplərdən biri, yəni sadə (skalyar) tip olarsa true qaytarır
  • is_null($v)$v dəyişəninə null mənimsədilibsə bu funksiya true qaytarır. Diqqət yetirmək lazımdır ki, belə dəyişənləri is_scalar() funksiyası ilə yoxladıqda nəticə false olur, çünki null skalyar kəmiyyət deyil.
  • is_array($v)$v dəyişəni massiv olarsa true qaytarır
  • is_object($v)$v dəyişənində obyektə keçid saxlanırsa true qaytarır
  • gettype($v)$v dəyişəninin tipinə uyğun olaraq “array”, “object”, “integer”, “double”, “string”, “boolean”, “null” və s. və ya tipi məlum deyilsə “unknown type” yazılarını qaytarır. “unknown type” yazısı dəyişənin tipi PHP-yə daxil edilmiş heç bir tipə uyğun olmayan zaman qaytarılır. Belə hal məsələn, PHP dilinin imkanlarını genişləndirmək üçün əlavə modulların qoşulması səbəbi ilə baş verə bilər.

Dəyişənin tipinin dəyişdirilməsi

PHP-də verilmiş dəyişənin tipini digər standart tiplərdən birinə çevirməyə çalışan universal funksiya mövcuddur: settype($var, $type)

Bu funksiya $var dəyişənini $type tipinə uyğunlaşdırmağa çalışır. Burada $type gettype() funksiyasının boolean-dan başqa qaytara biləcəyi qiymətlərdən biridir. settype() işini uğurla yerinə yetirə bilmədikdə false qaytarır. Bu məsələn, $var sətir tipli “ədəd olmayan” dəyişəndirsə settype($var, "integer") false qaytaracaq.

PHP-də settype() funksiyasından başqa dəyişəni digər tipə uyğunlaşdırmaq üçün xüsusi funksiyalar da mövcuddur.

floatval($var)
Bu funksiya $var dəyişənini həqiqi ədədə çevirməyə çalışır. Bu funksiyanın doubleval() kimi başqa adı da var. Hər iki funksiya tamamilə eyni işi görür.

strval($var)
Bu funksiya $var dəyişənini sətir tipinə çevirir.

intval($var[, $base])
Funksiya $var dəyişənini integer tipli dəyişənə çevirir. $base arqumenti nəticənin hansı əsaslı hesablama sisteminə uyğun qaytarılacağını müəyyən edir. Əgər funksiyaya xüsusi olaraq $base arqumenti ötürülməyibsə, nəticə susmaya görə 10-luq say sistemində qaytarılır. Ancaq $base arqumentini məsələn, 8 kimi ötürsək nəticəni 8-lik say sistemində əldə etmiş olacağıq:

 echo intval(42); // 42
 echo intval(42, 8); // 42
 echo intval('42', 8); // 34

Göstərilən funsiyalardan başqa PHP-də tipin digər tipə uyğunlaşdırılmasının C dilindəkinə uyğun sintaksisi də mövcuddur. Bu zaman lazım olan tip dəyişənin qarşısında mötərizədə yazılır:

 $value = 3.14;
 echo (int)$value; // 3 (integer)
 echo (string)$value; // 3.14 (string)
 echo (boolean)$value; // 1 (boolean) 

Buna bənzər sintaksislərin siyahısı aşağıdakı cədvəldə göstərilmişdir:

Tipi dəyişmə əməliyyatı Əməliyyat
(int)
(integer)
Tam ədədə çevirmək
(bool)
(boolean)
Məntiqi tipə çevirmək
(float)
(double)
(real)
Həqiqi ədədə çevirmək
(string) Sətir tipinə çevirmək
(array) Massivə çevirmək
(object) Obyektə çevirmək
(unset) null-a çevirmək

Dəyişənlər üzərində əməllər

Hər bir dəyişən üzərində tipindən asılı olmayaraq üç əsas əməliyyat etmək mümkündür.

Qiymətin mənimsədilməsi

Biz hər hansı bir dəyişənə digər dəyişənin qiymətini mənimsədə bilərik. Bu, həmçinin hər hansı bir funksiyanın qaytardığı qiymət də olar bilər. İxtiyari bir dəyişənə başqa dəyişənə istinad (reference) və ya sabit ifadə mənimsədə bilərik. Müstəsna yalnız new operatoru ilə açıq inisializasiya edilən obyektlərdir. Əvəlki mövzularda deyildiyi kimi tipin dəyişdirilməsinə interpretator özü nəzarət edir. Mənimsədilmə zamanı dəyişənin əvvəlki qiyməti və ən əsası tipi haqqında məlumat itir və o, öz “yaradıcısının” dəqiq eynisi olur. Yəni biz massiv dəyişəninə birbaşa rəqəm mənimsətsək problem olmayacaq, ancaq massivin məlumatalrı itirilmiş olacaq.

Mövcudluğun yoxlanılması

Göstərilən dəyişənin mövcud olduğunu, yəni inisializasiya edilib edilmədiyini yoxlamaq mümkündür. Bu, PHP-in daxili isset() operatoru ilə edilir. Nümunə:

<?php
if(isset($my_var)){
    echo "Dəyişən mövcuddur, qiyməti: $my_var";
}
?>

Bu an dəyişən mövcud deyilsə, yəni əvvəl heç bir yerdə bu dəyişənə qiymət mənimsədilməyibsə və ya əvvəldən unset() vasitəsilə dəyişən əllə ləğv edilibsə isset() yanlış – false qaytarır, əks halda doğru – true qaytarır.

Yadda saxlamaq vacibdir ki, inisializasiya edilməmiş dəyişənləri proqramda istifadə etmək olmaz, əks halda bu interpretator tərəfindən xəbərdarlıqla nəticələnəcək (çox güman ki, bu skriptdə məntiqi səhf olduğuna dəlalət edəcək). Bu xəbərdarlığı “söndürmək” olar və bu zaman inisializasiya edilməmiş dəyişənlər boş sətir dəyişənləri kimi qəbul edilmiş olacaq. Ancaq belə etmək məsləhət edilmir. Skripti belə halların baş verməməsi üçün yenidən yoxlamaq daha məqsədəuyğun hesab edilir.

Dəyişənin silinməsi

Dəyişənin yaddaşdan silinməsi unset() operatoru ilə yerinə yetirilir. Bundan sonra dəyişən interpretatorun daxili siyahısından silinir, yəni proqram işini əvvəldən bu dəyişən heç yaradılmayıb kimi davam edir. Nümunə:

<?php
    // $var dəyişəni hələ mövcud deyil
    $var = "Mövcud dəyişən";
    // artıq $var dəyişəni mövcuddur
    echo $var;
    // $var dəyişəninin ləğv edək
    unset($var);
    // $var dəyişəni artıq mövcud deyil
    echo $var; // Notice: Undefined variable
?>

Əslində adi dəyişənlərə unset() tətbiq etmək nadir hallarda lazım gəlir. Ondan, daha çox məsələn, asosiativ massivin elementini ləğv etmək üçün istifadə etmək daha məqsədəuyğundur. Məsələn $my_arr massivinin my_key açar sözlü elementini ləğv etmək üçün unset($my_arr['my_key']) əmri istifadə edilir.

Qeyd etmək lazımdır ki, isset(), unset() formatına görə adi daxili funksiyalara bənzəməsinə baxmayaraq, əslində operatorlardır. Həqiqətən də məsələn, unset() funksiya olarsa məsələn, unset($my_arr['my_key']) komandası zamanı parametr kimi massivin uyğun elementinin özü yox qiyməti ötürülərdi və nəticədə funksiya ilkin massivdə dəyişiklik edə bilməzdi.

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.