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 rn, Mac OS X-də nr 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); 
?>

İstinad dəyişənləri

Proqramlaşdırmada göstərici dəyişən pointer (İngilis dilində “pointer“, Rus dilində “указатель“) anlayışı var (məsələn, C və Paskal dilində). Bu dəyişəndə kompüterin yaddaşının xanalarının adresini saxlamaq mümkündür, yəni bu dəyişən yaddaşda hər hansı bir qiymətin yerini “göstərir”. İlk görünüşdə mürəkkəb görünsə də əslində bu anlayışı kitab misalında aydın təsəvvür etmək mükündür. Kitabın mündəricatındakı sətirləri uyğun bölmələrin kitabda yerini göstərən “göstəriciləri” kimi qəbul etmək olar. Belə göstəricinin qiyməti dedikdə isə kitabın vərəqlənərək göstəricinin göstərdiyi uyğun səhifəsinin oxunması başa düşülür.

Göstərici dəyişənlər sətirlər, massiv və asosiativ massivlər (lookup table), ağac strukturu üzərində təkrarlanan əməliyyatları nəzərə çarpacaq dərəcədə tezləşdirir.

PHP-də ümumilikdə pointer anlayışı yoxdur, ancaq burda digər dəyişənlərə “istinad edən” dəyişən yaratmaq mümkündür (İngilis dilində “reference variable“, Rus dilində “ссылочные переменные“). İstinad dəyişənlərinin üç növü müvcuddur: birbaşa, simvolik və obyektlərə istinad.

Birbaşa istinad

Birbaşa istinad dedikdə başqa bir dəyişənin sinonimi başa düşülür. Çox səviyyəli istinad, yəni istinad dəyişəninin özünə istinad yaratmaq qəbul edilmir. Buna görə də birbaşa istinad dəyişənlərini sinonimdən başqa qeyri-adi bir anlayış kimi qəbul etmək lazım deyil.

Birbaşa istinad yaratmaq üçün =& operatorundan istifadə edilir. Nümunə:

$a = 10;
$b =& $a; // artıq $b dəyişəni $a dəyişəni ilə eyni mənalıdır
$b = 0; // deməli həm də $a = 0 olur
echo "b = $b, a = $a"; // "b = 0, a = 0" çap edilir

Həmçinin massivin elementlərinə də istinad dəyişəni yaratmaq olar və bununla birbaşa istinad dəyişənləri simvolik növdən fərqlənir. Nümunə:

$h = array(
  'ad' => 'Cəfər',
  'soyad' => 'Cabbarlı'
);
$r =& $h['ad']; // $r - 'ad' indeksli elementlə eyni mənalı olur
$r = "Abbas"; // əslində $h['ad'] = "Abbas";
echo $h['ad']; // "Abbas" çap edilir

Digər bir tərəfdən, birbaşa istinad yaradılacaq massivin indeksi mövcud olmaya da bilər:

<?php
  $h = array(
    'ad' => 'Cəfər',
    'soyad' => 'Cabbarlı'
  );
  $b =& $h['ata_adı']; // $b - 'ata_adı' indeksli elementlə eyni mənalı olur
  echo "'ata_adı' indeksli element: " . $h['ata_adı'] . "<br/>";
  echo "'ata_adı' indeksli mövcud olmayan elementin tipi: " . gettype($h['ata_adı']); 
?>

$b dəyişəninə heç nə mənimsədilməməsinə baxmayaraq proqramın yerinə yetirliməsi zamanı $h massivində ‘ata_adı’ indeksi element yaradılmış olur və onun qiyməti null olur və onu çap edəndə heç bir xəbərdarlıq göstərilmir, NULL çap edilir. Burdan çıxır ki, birbaşa istinad mövcud olmayan “obyektə” edilə bilməz və belə hal baş verərsə uyğun obyekt yaradılmış olur.

Maraq üçün proqramın kodunda istinad yaradılan sətri silin. Bu zaman mütləq $h massivində ‘ata_adı’ indeksli elementin mövcud olmadığı haqda məlumat çap ediləcək.

Yaddaşın təmizlənməsi alqoritmi

Gəlin PHP-də dəyişənlərin işləmə prinsipini aşağıdakı kimi təsəvvür edək. $a dəyişəninə hər hansı dəyər mənimsədilən zaman nə baş verir?

  1. Dəyərin yadda saxlanılması üçün əməli yaddaşda yer ayrılır.
  2. PHP öz daxili cədvəllərində yeni yaradılmış $a dəyişənini qeyd edir və bu dəyişəni əməli yaddaşda indicə ayrılmış yaddaş sahəsi ilə əlaqələndirir.

Artq, $a-ya müraciət zamanı PHP onu öz cədvəllərində tapıb onun qiymətini əldə etmək üçün əvvəldən ayrılmış yaddaş bölməsinə müraciət edəcək.

$a dəyişəninə birbaşa $r istinadı yaradılan zaman nə baş verdiyinə baxaq. Bu zaman PHP öz daxili cədvəllərində $r dəyişəni haqqında yeni qeyd yaradır, ancaq bu dəfə onunla yaddaşın yeni sahəsini yox $a dəyişəninə ayrılmış sahəni əlaqələndirir. Nəticədə $a$r yaddaşın eyni bölməsinə yönəlmiş olur və buna görə də bu dəyişənlər sinonim olurlar.

PHP-in birbaşa istinad üçün yerinə yetirdiyi unset($r) operatoru onun istinad etdiyi obyekti yaddaşdan silmir və onun aid olduğu yaddaş sahəsini təmizləmir. O, yalnız istinad dəyişənilə “obyekt” arasındakı əlaqəni ləğv edib öz daxili cədvəllərindən $r haqqında məlumatı silir. Əslində bu zaman o, “obyektin” özünü yox edə bilməz, çünki $a dəyişəni hələ də bu obyektə yönəlmiş olaraq qalır.

Beləliklə, birbaşa istinad və və onun istinad etdiyi dəyişənin özü (obyekt) tamamilə eynihüquqludur. Onlardan birinin dəyişməsi digərində də həmin dəyişikliyə səbəb olur. unset() operatoru obyektlə istinad arasında əlaqəni ləğv edir. Obyektin özü isə yalnız, ona heç bir istinadın olmadığı andan, yəni onunla əlaqəli artıq heç bir dəyişənin qalmadığı andan sonra yaddaşdan silinir.

Belə alqoritm, yəni obyektlərin onlara sonuncu istinadın yox olmasından sonra silinməsinə, adətən yaddaşın təmizlənməsi alqoritmi deyilir (Rus dilində “алгоритм сбора мусора“, İngilis dilində “garbage collection“).

Simvolik istinad

Simvolik istinad digər dəyişənin adını saxlayan sətir tipli dəyişəndir. Simvolik istinadı yaradılmış dəyişənin qiymətini əldə etmək üçün istinad dəyişəninin solunda əlavə $ işarəsi yazmaq lazımdır. Nümunə:

$right = "red";
$wrong = "blue";
$color = "right";
echo $$color;      // $right dəyişəninin qiymətini çap edir ("red")
$$color = "white"; // $right dəyişəninə yeni qiymət mənimsədir

Göründüyü kimi adi sətir dəyişənindən istinad kimi istifadə etmək üçün onun soluna $ işarəsi yazılıb. Belə yazılış interpretatora $color dəyişəninin özünün qiymətini yox, adı $color dəyişəninin qiymətinə uyğun dəyişənin qiymətini götürməyi bildirir.

Praktikada bu tip istinad çox nadir hallarda istifadə olunur və ondan istifadə proqramı başa düşmək üçün daha da mürəkkəbləşdirir. Buna görə də onların istifadəsindən qaçmaq məsləhətdir.

UNIX ƏS-in fayl sistemi ilə yaxından tanış olanlara “birbaşa” və “simvolik” istinad anlayışları fayllarla eyni adlı anlayışları xatırlada bilər. Burda demək olar ki, tam analogiya var və PHP haqqında rəsmi mənbələrdə də bu xüsusiyyətə diqqət yetirilir.

Obyektə istinad

PHP 5 versiyasından başlayaraq massiv və obyektlərin nüsxələnməsi, yəni digər bir dəyişənə mənimsədilməsi “istinad” vasitəsilə edilir. Bir qədər irəli gedərək, obyektin yaradılması nümunəsinə baxaq:

<?php
  // Yeni klass elan edək
  class AgentSmith {} 
  // AgentSmith klassına uyğun obyekt yaradılır
  $first = new AgentSmith();
  // klassın atributuna qiymət mənimsədirik
  $first->mind = 0.123;
  // Obyektin nüsxəsini yaradırıq
  $second = $first;
  // Yeni nüsxədə "mind" atribununun qiymətini dəyişirik
  $second->mind = 100;
  // Hər iki obyektin atributunu çap edirik
  echo "First mind: {$first->mind}, second: {$second->mind}";
?>

Skripti işə salsaq görərik ki, çap olunun rəqəmlər eynidir və ikisi də 100-ə bərabərdir. Bunun səbəbini izah edək. İş orasındadır ki, PHP-də dəyişəndə obyektin özü saxlanılmır. Dəyişəndə yalnız uyğun obyektə istinad saxlanılır. Proqramın sonunda echo $first; yazıb işə salsaq “Object id #1” çap edildiyini görərik (bu zaman həm də obyektin birbaşa sətrə çevirilməsinin mümkün olmaması haqqında xəbərdarlıq çap ediləcək). Bu, dəyişənin 1 nömrəli obyektə istinad olduğunu göstərir. Dəyişənlərin ikisi də eyni obyektə istinad etdiklərindən, $second dəyişəninin də qiymətini çap etmək istəyəndə eyni məlumat çap ediləcək.

Göründüyü kimi, dəyişənlərdə yalnız obyektə istinad saxlanıldığından onların digər dəyişənlərə mənimsədilməsi zamanı obyektin özü yox, məhz ona istinad mənimsədilmiş olur. Bunu əslidə sadə bir bənzətmə ilə daha aydın təsəvvür etmək olar: Hər hansı tədbirə gedərkən paltonu (obyekt) qarderoba təhfil verib ona uyğun nömrə (istinad) götürürük. Sonra usta yanına gedib bu nömrənin dublikatını hazırladırıq. Nəticədə bir paltoya iki nömrə əldə etmiş olacağıq, palto isə bir nüsxədə olaraq qalacaq.

Gələcəkdə obyektlər və onlara istinadlar barəsində ətrafalı danışılacaq.

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.

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.