PHP-də sabitlər. PHP-də sabitlərin yaradılması - const və define() Php sabitləri faylı




Hamıya xeyirli gün. Aleksey Qulynin əlaqə saxlayır. Son məqalədə baxdıq PHP-də ekvivalent operator. Bu yazıda haqqında danışmaq istərdim PHP-də sabitlər. Məktəbdə tez-tez sabitlərə, məsələn, "PI nömrəsinə" və ya fizikadan universal qaz sabitinə (R) rast gəlirdiniz. Sabitlər bir dəfə müəyyən edilir və daha dəyişmirlər. Eyni şey proqramlaşdırmada sabitlərə də aiddir, yəni. biz sabiti bir dəfə təyin edirik və o, proqram kodunda heç vaxt dəyişmir. Sabitlər müxtəlif riyazi qiymətlər, fayllara gedən yollar ola bilər.

Sabit dəyişəndən nə ilə fərqlənir:

1) Bir dəfə müəyyən edilir və başqa heç bir yerdə dəyər təyin edilə bilməz,
2) Ona istinad etmək üçün onun qarşısına “$” işarəsi qoymaq lazım deyil (burada mənfi var - indi mətn sətirində sabitin adından istifadə edə bilmirik).
Gəlin "PI" sabitini çap edək:

Sabitlərin iki növü var: tərcüməçi tərəfindən müəyyən edilmiş və istifadəçi tərəfindən müəyyən edilmişdir:

Tərcüməçi tərəfindən təyin olunan sabitlərin nümunələri:

1) __FILE__ - hazırda icra olunan kodu ehtiva edən faylın adını saxlayır,
2) PHP_VERSION - PHP tərcüməçisinin versiyası,
3) PHP_OS - PHP-nin işlədiyi əməliyyat sisteminin versiyası.

Aşağıdakı kodu yazın və başqa hansı sabitlərin olduğuna baxın:

Öz sabitlərinizi təyin edə bilərsiniz, bu, müəyyən operatorundan istifadə etməklə edilir. 2 sabiti təyin edək:

"; echo Const2; ?>

Bu halda, biz bu sabitlərin dəyərlərini göstərəcəyik.

Varsayılan olaraq, daimi ad hərf hərfinə həssasdır; onu isteğe bağlı üçüncü parametrdən istifadə etməklə söndürmək olar, məsələn:

"; echo yeniW1; ?>

Hər şeyin işlədiyini görəcəksiniz (əvvəlki nümunədə bu işləməyəcək, çünki hərflərə həssasdır).

Sabitin adının yazıldığı dırnaq işarələrinə diqqət yetirin. Bu mütləq edilməlidir. Həmçinin, eyni adlarla sabitlər yarada bilməzsiniz.

PHP-də funksiyadan istifadə edərək sabitin olub-olmadığını yoxlaya bilərsiniz müəyyən edilmiş (sabit ad). Bunu aydınlaşdırmaq üçün bir nümunəyə baxaq:

Bu nümunəni yazın və nə baş verdiyinə baxın.

(PHP 5 >= 5.3.0, PHP 7)

Bu sualların siyahısı iki hissəyə bölünür: ümumi suallar və daha tam başa düşmək üçün faydalı olan bəzi icra xüsusiyyətləri.

Birincisi, ümumi suallar.

  1. Əgər ad boşluqlarından istifadə etməsəm, bunlardan hər hansı birini vacib hesab etmək lazımdırmı?
  2. Ad məkanında daxili və ya qlobal siniflərdən necə istifadə edə bilərəm?
  3. Ad fəzalarında sinif funksiyalarından və ya öz ad məkanında sabitlərdən necə istifadə edə bilərəm?
  4. Necə bir ad belədir \mənim adım və ya \adçevrildi?
  5. kimi bir ad kimi mənim adımçevrildi?
  6. Kimi keyfiyyətsiz sinif adı kimi adçevrildi?
  7. Kvalifikasiya olunmamış funksiya adı və ya qeyri-təsərrüfat daimi adı kimi adçevrildi?

Anlamaq üçün faydalı olan bəzi ad sahəsinin tətbiqi təfərrüatları.

  1. İdxal edilmiş adlar eyni faylda müəyyən edilmiş siniflərlə ziddiyyət təşkil edə bilməz.
  2. Operatordan istifadə etməklə nə funksiyalar, nə də sabitlər idxal edilə bilməz istifadə edin.
  3. Dinamik ad məkanı adları (dırnaq içərisində olan identifikatorlar) tərs xətt simvolundan qaçmalıdır.
  4. Siz tərs xətt istifadə edərək qeyri-müəyyən sabitlərə istinad edə bilməzsiniz. Ölümcül bir səhv göstərilir
  5. NULL, TRUE, FALSE, ZEND_THREAD_SAFE və ya ZEND_DEBUG_BUILD kimi xüsusi sabitləri ləğv etmək mümkün deyil

Əgər ad boşluqlarından istifadə etməsəm, bunlardan hər hansı birini vacib hesab etmək lazımdırmı?

Yox. Ad boşluqlarının hər hansı formada mövcud olan koda və ya ad boşluğunu ehtiva etməyən yazılmış hər hansı koda heç bir təsiri yoxdur. İstəsəniz kodu belə yaza bilərsiniz:

Nümunə 1 Ad boşluqlarından kənar qlobal siniflərə daxil olmaq

$a = yeni \ stdClass ;
?>

Bu, funksional olaraq aşağıdakılara bərabərdir:

Nümunə 2 Ad boşluqlarından kənar qlobal siniflərə daxil olmaq

$a = yeni stdClass ;
?>

Ad məkanında daxili və ya qlobal siniflərdən necə istifadə edə bilərəm?

Nümunə #3 Ad məkanlarında daxili siniflərə daxil olmaq

ad sahəsi foo;
$a = yeni \ stdClass ;

funksiya testi (\ArrayObject $type hintexample = null ) ()

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// daxili və ya qlobal sinfin genişləndirilməsi
sinif MyException genişləndirir\Exception()
?>

Sinif funksiyalarını ad boşluqlarında və ya öz ad məkanında sabitlərdən necə istifadə edə bilərəm?

Nümunə №4 Daxili siniflərə, funksiyalara və ya ad fəzalarında sabitlərə daxil olmaq

ad sahəsi foo;

sinif MyClass()

// cari ad sahəsindən sinifdən istifadə edin
funksiya testi (MyClass $type ipucu misal = null ) ()
// cari ad sahəsindən sinifdən istifadə etməyin başqa bir yolu
funksiya testi(\foo\MyClass $typehintexample = null)()

// sinifin cari adlar sahəsindən genişləndirilməsi
sinif Genişləndirilmiş MyClass()-ı genişləndirir

// qlobal funksiyaya giriş
$a = \globalfunc();

// qlobal sabitə giriş
$b = \INI_ALL ;
?>

Necə bir ad belədir \mənim adım və ya \adçevrildi?

ilə başlayan adlar \ həmişə göründüklərinə çevrilirlər, yəni. \mənim adım- bu əslində mənim adım, Və \İstisna- Bu İstisna.

Nümunə №5 Mütləq adlar

ad sahəsi foo;
$a = yeni \ mənim \ adım (); // "my\name" sinfinin nümunəsini yaradır
echo\strlen("salam"); // "strlen" funksiyasını çağırır
$a = \INI_ALL ; // $a dəyişəninə "INI_ALL" sabitinin qiyməti təyin olunur
?>

kimi bir ad kimi mənim adımçevrildi?

Tərkibində əks xətti olan, lakin bir ilə başlamayan adlar, məsələn mənim adım

mənim başqa bir ad, onda bu sinonimə aiddir mənim V mənim adım.

mənim adım.

Nümunə №6 Tam adlar

ad sahəsi foo;
foo kimi blah \ blah istifadə edin;

$a = yeni mənim\adım(); // "foo\my\name" sinfinin nümunəsini yaradır
foo\bar::name(); // "blah\blah\bar" sinfində "name" statik metodunu çağırır
mənim\bar(); // "foo\my\bar" funksiyasını çağırır
$a = mənim\BAR; // $a dəyişəninə "foo\my\BAR" sabitinin qiymətini təyin edir
?>

Kimi keyfiyyətsiz sinif adı kimi adçevrildi?

kimi tərs kəsik işarəsi olmayan sinif adları ad iki müxtəlif yolla çevrilə bilər.

Sinonim yaradan idxal ifadəsi varsa ad başqa ad, sonra bu sinonim istifadə olunur.

Əks halda, cari ad sahəsinin adı prefiksə çevrilir mənim adım.

Nümunə №7 Qeyri-ixtisaslı sinif adları

ad sahəsi foo;
foo kimi blah \ blah istifadə edin;

$a = yeni ad(); // "foo\name" sinfinin nümunəsini yaradır
foo::name(); // "blah\blah" sinfində "name" statik metodunu çağırır
?>

Kvalifikasiya olunmamış funksiya adı və ya qeyri-təsərrüfat daimi adı kimi adçevrildi?

kimi tərs kəsik işarəsi olmayan funksiyaların və ya sabitlərin adları ad iki müxtəlif yolla çevrilə bilər.

Birincisi, cari ad sahəsinin adı prefiks olunur ad.

Sonra əgər sabit və ya funksiya ad qlobal sabit və ya funksiyadan istifadə edərək cari ad məkanında mövcud deyil ad, əgər varsa.

Nümunə №8 Natamam funksiya və ya sabit adlar

ad sahəsi foo;
foo kimi blah \ blah istifadə edin;

const FOO = 1;

my()() funksiyası
foo()() funksiyası
funksiya çeşidi (& $a )
{
\sort($a); // qlobal funksiyanı "sort" çağırır
$a = massiv_flip($a);
$a qaytarın;
}

Mənim(); // "foo\my" çağırır
$a = strlen("salam"); // qlobal funksiyanı "strlen" adlandırır, çünki "foo\strlen" mövcud deyil
$arr = massiv(1, 3, 2);
$b = sırala($arr); // "foo\sort" funksiyasını çağırır
$c = foo(); // "foo\foo" funksiyasını çağırır - idxal tətbiq edilmir

$a = FOO ; // $a dəyişəninə "foo\FOO" sabitinin qiymətini təyin edir - idxal tətbiq edilmir
$b = INI_ALL ; // $b dəyişəninə qlobal sabitin "INI_ALL" dəyərini təyin edir
?>

İdxal edilmiş adlar eyni faylda müəyyən edilmiş siniflərlə ziddiyyət təşkil edə bilməz.

Aşağıdakı skript birləşmələri etibarlıdır:

namespace my\stuff;
sinif MyClass()
?>

ad sahəsi başqa ;
sinif şey()
?>

namespace my\stuff;
"file1.php" daxil edin;
"other.php" daxil edin;


$a = yeni MyClass; // "başqa" ad məkanından "şey" sinfinin nümunəsini yaradır
?>

Sinif olmasına baxmayaraq ad konflikti yoxdur Mənim sinfim ad məkanında mövcuddur mənim əşyalarımçünki MyClass tərifi ayrıca fayldadır. Bununla belə, aşağıdakı nümunə ölümcül ad konflikti xətası yaradır, çünki MyClass sinfi istifadə ifadəsinin yerləşdiyi eyni faylda müəyyən edilmişdir.

namespace my\stuff;
MyClass kimi başqa bir şey istifadə edin;
sinif MyClass() // ölümcül xəta: MyClass idxal ifadəsi ilə ziddiyyət təşkil edir
$a = yeni MyClass;
?>

Daxili ad boşluqlarına icazə verilmir.

PHP ad boşluqlarının bir-birinə daxil olmasına icazə vermir

ad sahəsi mənim\əşyalarım(
ad boşluğu (
sinif foo()
}
}
?>

Bununla belə, yuvalanmış ad boşluqlarını bu kimi simulyasiya etmək üçün:

ad sahəsi mənim\əşyalarım\içləşdi (
sinif foo()
}
?>

PHP 5.6-dan əvvəl operatordan istifadə etməklə nə funksiyalar, nə də sabitlər idxal edilə bilməzdi istifadə edin.

PHP 5.6-dan əvvəl operatorun təsir etdiyi yeganə elementlərdir istifadə edin ad fəzaları və sinif adlarıdır. Uzun sabit və ya funksiya adlarını qısaltmaq üçün onların məzmununu ad sahəsinə idxal edin.

ad sahəsi mina;
ultra\uzun\ns\addan istifadə edin;

$a = ad \ CONSTANT ;
ad\func();
?>

PHP 5.6-dan bəri funksiyalar və sabit adlar üçün ləqəbləri idxal etmək və yaratmaq mümkün olmuşdur.

Dinamik ad məkanı adları (dırnaq içərisində olan identifikatorlar) tərs xətt simvolundan qaçmalıdır.

Bunu təmsil etmək çox vacibdir, çünki tərs xətt sətirlərin içərisində qaçış simvolu kimi istifadə olunur. Bir sətirdə istifadə edildikdə həmişə təkrarlanmalıdır, əks halda gözlənilməz nəticələr riski var:

Nümunə #9 İki dırnaqlı sətir daxilində ad sahəsi adından istifadə edərkən tələlər

$a = "təhlükəli\ad" ; // \n iki dırnaqlı sətir daxilində yeni sətirdir!
$obj = yeni $a ;

$a = "heç\təhlükəli deyil" ; // burada problem yoxdur.
$obj = yeni $a ;
?>

Tək dırnaqlı sətirlər daxilində, ayırıcı kimi tərs xətt daha təhlükəsizdir, lakin bütün sətirlərdə tərs xəttdən qaçmaq üçün tövsiyə olunan təcrübə hələ də ən yaxşı təcrübədir.

Siz tərs xətt istifadə edərək qeyri-müəyyən sabitlərə istinad edə bilməzsiniz. Ölümcül bir səhv göstərilir

Kimi qeyri-müəyyən ad olan hər hansı qeyri-müəyyən sabit FOO, PHP-nin bunu qəbul etdiyini bildirən bir mesajla nəticələnəcək FOO sabitin qiyməti idi. Təsdiq edilmiş və ya mütləq ada malik hər hansı sabit, əks kəsik işarəsi olan, tapılmadıqda ölümcül xəta ilə nəticələnəcək.

Nümunə №10 Müəyyən edilməmiş sabitlər

ad sahəsi çubuğu;
$a = FOO ; // xəbərdarlıq göstərir: qeyri-müəyyən sabitlər "FOO" "FOO" qəbul edir;
$a = \FOO ; // ölümcül xəta: təyin olunmamış ad sahəsi sabiti FOO
$a = Bar\FOO; // ölümcül xəta: qeyri-müəyyən ad sahəsi sabit bar\Bar\FOO
$a = \Bar \FOO ; // ölümcül xəta: müəyyən edilməmiş ad sahəsi sabiti Bar\FOO
?>

NULL, TRUE, FALSE, ZEND_THREAD_SAFE və ya ZEND_DEBUG_BUILD kimi xüsusi sabitləri ləğv etmək mümkün deyil

Xüsusi daxili sabitlərin adlarına uyğun gələn ad sahəsi sabitini təyin etmək cəhdi ölümcül xəta ilə nəticələnəcək.

Nümunə №11 Müəyyən edilməmiş sabitlər

ad sahəsi çubuğu;
const NULL = 0 ; // Fatal səhv;
const true = "axmaq" ; // həmçinin ölümcül səhv;
// və s.
?>

7 il əvvəl

Define funksiyasından istifadə edərək və case_insensitive üçüncü parametrini false olaraq təyin edərək, xüsusi, daxili sabit olan ad boşluqlu sabiti təyin etməyin bir yolu var:

ad sahəsi foo;
müəyyən edin (__NAMESPACE__ . "\NULL" , 10 ); // cari ad məkanında NULL sabitini təyin edir


?>

Adətən baş verdiyi kimi, müəyyən etmək () üçün zənginizdə ad sahəsini təyin etməyə ehtiyac yoxdur
ad sahəsi foo;
müəyyən (INI_ALL, "bar"); // bildiriş yaradır - Sabit INI_ALL artıq müəyyən edilmişdir. Amma:

Müəyyən et (__NAMESPACE__ . "\INI_ALL" , "bar" ); // cari ad məkanında INI_ALL sabitini təyin edir
var_dump(INI_ALL); // string(3)"bar" göstərəcək. İndiyə qədər heç nə yoxlanılmayıb. Amma:

Define("NULL", 10); // cari ad məkanında NULL sabitini təyin edir...
var_dump(NULL); // 10 göstərəcək
var_dump(null); // NULL göstərəcək
?>

Əgər case_insensitive parametri doğru olaraq təyin edilibsə
ad sahəsi foo;
müəyyən edin (__NAMESPACE__ . "\NULL" , 10 , doğru ); // bildiriş yaradır - Constant null artıq müəyyən edilib
?>

3 il əvvəl

Dəyişənlərdən istifadə edərək ad fəzaları daxilində siniflər yaradarkən və ya statik metodları çağırarkən nəzərə almalısınız ki, müvafiq sinifdən istifadə etmək üçün onların tam ad sahəsi tələb olunur; siz eyni ad məkanında çağırılsa belə, ləqəbdən və ya qısa addan istifadə edə bilməzsiniz. Bunu nəzərə almamaq kodunuzun səhv sinifdən istifadə etməsinə, ölümcül itkin sinif istisnasına və ya səhvlər və ya xəbərdarlıqlara səbəb ola bilər.

Bu hallarda siz __NAMESPACE__ sehrli sabitindən istifadə edə və ya tam ad sahəsini və sinif adını birbaşa təyin edə bilərsiniz. class_exists funksiyası həmçinin tam ad sahəsi və sinif adını tələb edir və çatışmayan siniflər səbəbindən ölümcül xətanın atılmamasını təmin etmək üçün istifadə edilə bilər.

ad sahəsi foo ;
sinif Bar (
ictimai statik funksiya testi () (
get_called_class();
}
}

ad sahəsi Foo\Foo;
sinif Barı \Foo \Bar (
}

Var_dump(Bar::test()); // sətir (11) "Foo\Foo\Bar"

$bar = "Foo\Bar" ;
var_dump($bar::test()); // sətir (7) "Foo\Bar"

$bar = __NAMESPACE__ . "\ Bar" ;
var_dump($bar::test()); // sətir (11) "Foo\Foo\Bar"

$bar = "Bar" ;
var_dump($bar::test()); // FATAL ERROR: "Bar" sinfi tapılmadı və ya Yanlış sinif \Bar istifadə edildi

Bu qeyddə biz sabitlər haqqında danışacağıq. Həmişə olduğu kimi, proqramlaşdırma dillərində sabitlər anlayışına baxaq və onların necə elan edildiyini və istifadə edildiyini görək. PHP-də sabitlər.

PHP-də sabit və sabitlər anlayışı

Sabit sözü sizə riyaziyyatdan artıq tanış olmalıdır:

“Riyazi sabit- dəyəri dəyişməyən kəmiyyət”.

PHP-də də eynidir. PHP-də daimi kodun icrası zamanı dəyişə bilməyən sadə dəyəri (sətir, bəzi ədəd) təyin etməyə xidmət edən identifikatordur.

Sabiti elan etmək üçün (ona qiymət təyin edin) funksiyadan istifadə edin müəyyənləşdirmək. Daimi bəyannamə nümunəsi:

PHP-də daimi adlar hərflərə həssasdır (böyük və kiçik hərflər fərqlidir), ona görə də diqqətli olmalısınız. Sabit adların həmişə böyük hərflə yazılmasına dair bir konvensiya da var.

Sabit ad hərf və ya alt xətt “_” ilə başlamalıdır və hərflərdən, rəqəmlərdən və alt xəttlərdən ibarət ola bilər.

Sabitdən istifadənin sadə nümunəsinə baxaq:

Bu misalda biz sabiti elan etdik və onu proqramda istifadə etdik.

Sabitlər nə üçün istifadə olunur və dəyişənlərdən istifadə etmək daha asan deyilmi?

Artıq qeyd edildiyi kimi, sabitlər proqramın icrası zamanı öz dəyərlərini dəyişə bilməzlər. Sabitlər adətən verilənlər bazasına giriş təfərrüatları (host, istifadəçi adı və parol, verilənlər bazası adı), diskdə saytın yeri və bir çox digər parametrlər kimi daimi sayt parametrlərini saxlayır.

Dəyişənlərdən istifadə etsək, skript təsadüfən (səhv olduqda) dəyişənin dəyərini dəyişə bilər və sizin nəzərdə tutduğunuz kimi işləməyəcək.

Sabitlərdən istifadə sabiti elan edərkən göstərdiyiniz dəyərin dəyişməz qalmasını təmin edir.

PHP-də layihələriniz üçün əvvəlcədən təyin edilmiş xüsusi sabitlər və sehrli metodlar dəsti var. Define() funksiyasından istifadə etməklə təyin oluna bilən adi sabitlərdən fərqli olaraq, əvvəlcədən təyin edilmiş sabitlərin mənası onların istifadə olunduğu yerdən asılıdır və kod və PHP sistemi haqqında yalnız oxuna bilən məlumatdır. Xüsusi PHP funksionallığına giriş əldə etmək üçün dərslərinizdə sehrli metodlardan istifadə edilə bilər.

Bu dərslikdə kodda istifadə nümunələri ilə bir neçə faydalı əvvəlcədən təyin edilmiş sabitlərə və sehrli metodlara baxacağıq.

Əvvəlcədən təyin edilmiş sabitlər

Əvvəlcədən təyin edilmiş sabitlər kodunuz haqqında məlumat əldə etmək üçün istifadə olunur. Belə sabitin adı ikiqat alt xətt arasında böyük hərflərlə yazılır, məsələn, __LINE__ və __FILE__ . PHP-də mövcud olan bəzi faydalı əvvəlcədən təyin edilmiş sabitlər bunlardır:

  • __LINE__ sabitin istifadə olunduğu mənbə faylında sətir nömrəsini qaytarır:

  • __FILE__ tam yol daxil olmaqla fayl adını təmsil edir:

  • __DIR__ yalnız fayl yolunu təmsil edir:

  • __CLASS__ cari sinfin adını təmsil edir:

  • __FUNCTION__ cari funksiyanın adını təmsil edir:

  • __METHOD__ cari metodun adını təmsil edir:

  • __NAMESPACE__ cari ad sahəsinin adını təmsil edir:

Sehrli üsullar

Sehrli üsullar xüsusi PHP funksionallığı üçün qarmaqlar təmin edir. Onların adları kiçik hərflərlə iki aparıcı alt xətt ilə yazılır, məsələn, __construct() və __destruct() .

Construct() PHP-nin öz sinifinizin nümunəsini yaratmaq üçün çağırdığı sehrli metoddur. İstənilən sayda arqumenti qəbul edir.

Destruct() PHP kollektoru tərəfindən obyekt məhv edildikdə çağırılan sehrli metoddur. Bu üsul heç bir arqument tələb etmir və adətən verilənlər bazası bağlantısını bağlamaq kimi xüsusi əməliyyatları yerinə yetirmək üçün istifadə olunur.

Növbəti bir neçə sehrli üsul xassələri manipulyasiya etmək üçün nəzərdə tutulmuşdur və PHP üçün müəyyən edilməmiş (və ya mövcud olmayan) xüsusiyyətlərə və metodlara edilən zəngləri idarə etmək üçün bir yol təqdim edir.

Xüsusiyyət müəyyən edilmədikdə (və ya mövcud deyilsə) PHP qəbuledici kontekstdə __get() metodunu çağırır. Metod bir arqument götürür - əmlakın adı. Mülkiyyət dəyəri kimi qəbul ediləcək bir dəyəri qaytarmalıdır.

__set() metodu parametr kontekstində qeyri-müəyyən bir xassə çağırılır. Bu üsul iki arqument, əmlak adı və dəyər götürür.

myAarray[$prop] = $dəyər; ) ictimai funksiya __get($prop) ( return $this->myArray[$prop]; ) ictimai funksiya __isset($prop) ( return isset($this->myArray[$prop]); ) ictimai funksiya __unset($prop) ) ( unset($this->myArray[$prop]); ) ictimai funksiya __toString() ( return __CLASS__ . ":" . $this->name; ) ) $obj = new MySample(); if (!isset($obj->name)) ( $obj->name = "Alireza"; ) echo $obj->ad; // Alireza echo $obj; // Mənim Nümunəm: Alireza

Yuxarıdakı kodda ad xassəsi sinifdə müəyyən edilməyib. Kod bu xassəni “Alireza” olaraq təyin etməyə çalışır və PHP __set() sehrli metodunu çağırır. O, “ad”ı $prop kimi, “Alireza” isə $value kimi qəbul edir və dəyəri $myArray özəl massivində saxlayır. __get() metodu oxşar şəkildə işləyir. $obj->name çap edərkən __get() metodu çağırılır və “name” dəyəri ona $prop arqumenti kimi ötürülür.

Verilən nümunədə olduğu kimi, əlçatmaz xassələri manipulyasiya etməyə kömək edən digər sehrli üsullar da var: __isset() , __unset() və __toString() . Həm __isset(), həm də __unset() metodları eyni adda, lakin PHP-də alt xətt olmadan funksiyalar tərəfindən idarə olunur.

Isset() xassə təyin olunub-olunmadığını yoxlayır. Bu üsul bir arqument götürür - yoxlanılması lazım olan əmlak. __unset() metodu bir arqument, sıfırlanacaq xassə adını alır.

Bir çox hallarda obyekti sətir kimi təqdim etmək, məsələn, istifadəçiyə və ya başqa prosesə çıxış üçün əlverişlidir. Tipik olaraq PHP obyekti yaddaşdaxili identifikator kimi təqdim edir və bu, bu kimi funksiyalar üçün pisdir. __toString() metodu obyekti sətir kimi təqdim etməyə kömək edir. Metod obyektin sətir kimi istifadə edildiyi bir çox hallarda işləyir, məsələn, echo "Salam $obj" . Onu da hər hansı digər ictimai metod kimi birbaşa çağırmaq olar.

İcra edilən hər bir skript üçün. Bu sabitlərin çoxu müxtəlif modullar tərəfindən müəyyən edilir və yalnız o modullar dinamik yükləmə və ya statik montaj vasitəsilə mövcud olduqda mövcud olacaqdır.

İstifadə olunduğu kontekstdən asılı olaraq mənasını dəyişən doqquz sehrli sabit var. Məsələn, dəyər __LINE__ skriptdə bu sabitin göstərildiyi sətirdən asılıdır. Bütün sehrli sabitlər iş vaxtında həll olunan adi sabitlərdən fərqli olaraq tərtib zamanı həll olunur. Xüsusi sabitlər hərflərə həssasdır və aşağıda verilmişdir:

Bəzi sehrli PHP sabitləri
ad Təsvir
__LINE__ Fayldakı cari sətir nömrəsi.
__FAYL__ Genişlənmiş simvolik keçidlərlə cari faylın tam yolu və adı. Daxil edilmiş fayl daxilində istifadə edilərsə, bu faylın adı qaytarılır.
__DIR__ Fayl kataloqu. Daxil edilmiş fayl daxilində istifadə edilərsə, həmin faylın kataloqu qaytarılır. Bu, zəng etməyə bərabərdir dirname(__FILE__). Qaytarılan kataloq adı kök qovluq istisna olmaqla, slash işarəsi ilə bitmir.
__FUNCTION__ Funksiya adı və ya (bağlama) anonim funksiya halda.
__CLASS__ Sinif adı. Bu adda sinfin elan edildiyi ad sahəsinin adı var (məsələn, Foo\Bar). Nəzərə alın ki, PHP 5.4 __CLASS__ xüsusiyyətlərdə də işləyir. Xarakter metodlarında istifadə edildikdə, __CLASS__ metodların istifadə olunduğu sinfin adıdır.
__TRAIT__ Xüsusiyyət adı. Bu ad əlamətin elan edildiyi ad sahəsini ehtiva edir (məsələn, Foo\Bar).
__METOD__ Sinif metodunun adı.
__NAMESPACE__ Cari ad sahəsinin adı.
ClassName::class Tam sinif adı (ad sahəsi daxil olmaqla). Həmçinin bax::class.

həmçinin bax get_class(), get_object_vars(), fayl_mövcud()funksiya_mövcuddur().

Dəyişikliklərin siyahısı

14 il əvvəl

Arasındakı fərq
__FUNCTION__ və __METHOD__ PHP 5.0.4-də olduğu kimi

FUNCTION__ yalnız funksiyanın adını qaytarır

__METHOD__ isə funksiyanın adı ilə birlikdə sinfin adını qaytarır

sinif hiyləsi
{
funksiya doit()
{
əks-səda __FUNCTION__;
}
funksiya doitagain()
{
əks-səda __METHOD__;
}
}
$obj=yeni hiylə();
$obj->doit();
çıxış ---- doit olacaq
$obj->doitagain();
çıxış ----- trick::doitagain olacaq

12 il əvvəl

__CLASS__ sehrli sabiti get_class() funksiyasını gözəl şəkildə tamamlayır.

Bəzən hər ikisini bilmək lazımdır:
- irsi sinfin adı
- faktiki icra edilən sinfin adı

Mümkün həlli göstərən bir nümunə:

Sinif əsas_sinifi
{
funksiya say_a()
{

" ;
}

funksiya say_b()
{

" ;
}

törəmə_sinifi baza_sinifi genişləndirir
{
funksiya say_a()
{
valideyn::say_a();
əks-səda ""a" - dedi " . __CLASS__ . "
" ;
}

funksiya say_b()
{
valideyn::say_b();
əks-səda ""b" - dedi " . get_class($this) . "
" ;
}
}

$obj_b = new derived_class();

$obj_b -> say_a();
əks-səda "
" ;
$obj_b -> say_b();

?>

Çıxış təxminən belə görünməlidir:

"a" - əsas_sinif dedi
"a" - törəmə_sinif dedi

"b" - törəmə_sinif dedi
"b" - törəmə_sinif dedi

3 il əvvəl

Xarakterlərdə __CLASS__ və __METHOD__ istifadə edərkən kiçik bir uyğunsuzluğa diqqət yetirin (php 7.0.4-də dayanın): __CLASS__ reklam edildiyi kimi işləyərkən və xüsusiyyətin istifadə olunduğu sinfin adını dinamik olaraq qaytararkən, __METHOD__ faktiki olaraq xüsusiyyətin adının əvvəlini yazır. sinif adı!

8 il əvvəl

5.3.0-dan əvvəlki versiyalarda geriyə uyğun __DIR__ tətbiq etmək üçün heç bir yol yoxdur.

Edə biləcəyiniz yeganə şey rekursiv axtarış aparmaq və dirname(__FILE__) ilə əvəz etməkdir:
tapmaq. -tip f -print0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"

5 il əvvəl

Buradakı bir çox qeydlər funksiyanı dəstəkləməyən PHP versiyaları üçün __DIR__ sehrli sabitinin müəyyən edilməsinə aiddir. Əlbəttə ki, siz hələ bu sabitə malik olmayan PHP versiyaları üçün bu sehrli sabiti təyin edə bilərsiniz, lakin __DIR__ sabitini təyin edən fayldan fərqli qovluqda ola bilən daxil edilmiş faylda sabitdən istifadə edən kimi o, öz məqsədini pozacaq. . Beləliklə, sabit öz *sehrini* itirdi və bütün daxiletmələrinizin eyni kataloqda olduğuna əmin olmasanız, faydasız olardı.

Nəticə: gmail dot com-un sehrli sabitləri təyin edə biləcəyiniz və ya edə bilməyəcəyinizlə bağlı qeydi etibarlıdır, lakin __DIR__ təyin etməyin faydasız olmadığını ifadə etmək düzgün deyil!

7 il əvvəl

Sehrli sabitin müəyyən edilib-edilmədiyini yoxlaya bilməzsiniz. Bu o deməkdir ki, __DIR__ təyin olunub-olunmadığını yoxlamaq, sonra onu müəyyən etmək mənasızdır. `defined("__DIR__")` həmişə yalanı qaytarır. __DIR__ təyin edilməsi PHP 5.3+-də səssizcə uğursuz olacaq. Skriptinizdə başqa skriptlər varsa, bu, uyğunluq problemlərinə səbəb ola bilər.

əks-səda (müəyyən edilmişdir ("__DIR__" ) ? "__DIR__ müəyyən edilmişdir" : "__DIR__ müəyyən edilməmişdir" . PHP_EOL );
echo (müəyyən edilmişdir ("__FILE__" ) ? "__FILE__ müəyyən edilmişdir" : "__FILE__ müəyyən edilməmişdir" . PHP_EOL );
echo (müəyyən edilmişdir ("PHP_VERSION" ) ? "PHP_VERSION müəyyən edilmişdir" : "PHP_VERSION müəyyən edilməmişdir" ) . PHP_EOL ;
echo "PHP Versiyası: " . PHP_VERSION. PHP_EOL ;
?>
Çıxış:
__DIR__ təyin olunmur
__FILE__ təyin olunmur
PHP_VERSION müəyyən edilmişdir
PHP Versiyası: 5.3.6