روش های جادویی و ثابت های از پیش تعریف شده در PHP. ایجاد ثابت در PHP - const and define() #3 const فقط اسکالرها را درک می کند

روز همگی بخیر الکسی گولینین در تماس است. در آخرین مقاله ای که به آن نگاه کردیم عملگر معادل سازی در PHP. در این مقاله می خواهم در مورد آن صحبت کنم ثابت ها در PHP. در مدرسه، شما اغلب با ثابت‌هایی مواجه می‌شوید، به عنوان مثال، "عدد PI" یا از فیزیک با ثابت گاز جهانی (R). ثابت ها یک بار تعریف می شوند و آنها دیگر تغییر نمی کنند. همین امر در مورد ثابت ها در برنامه نویسی صدق می کند، به عنوان مثال. یک بار ثابت تعریف می کنیم و هرگز در کد برنامه تغییر نمی کند. ثابت ها می توانند مقادیر مختلف ریاضی، مسیرهای فایل ها باشند.

چگونه یک ثابت با یک متغیر متفاوت است:

1) یک بار تعریف شده است و نمی توان آن را در هیچ جای دیگری یک مقدار اختصاص داد،
2) برای مراجعه به آن، نیازی به قرار دادن علامت "$" در مقابل آن ندارید (اینجا یک منهای وجود دارد - اکنون نمی توانیم از نام ثابت در یک رشته متن استفاده کنیم).
بیایید ثابت "PI" را چاپ کنیم:

دو نوع ثابت وجود دارد: تعریف شده توسط مترجم و تعریف شده توسط کاربر:

نمونه هایی از ثابت های تعریف شده توسط مفسر:

1) __FILE__ - نام فایلی را که حاوی کدی است که در حال حاضر اجرا می شود، ذخیره می کند.
2) PHP_VERSION - نسخه مفسر PHP،
3) PHP_OS - نسخه ای از سیستم عاملی که PHP تحت آن اجرا می شود.

کد زیر را تایپ کنید و ببینید چه ثابت های دیگری وجود دارد:

شما می توانید ثابت های خود را تعریف کنید، این کار با استفاده از عملگر define انجام می شود. بیایید 2 ثابت تعریف کنیم:

"; echo Const2; ?>

در این حالت مقادیر این ثابت ها را نمایش خواهیم داد.

به طور پیش‌فرض، نام ثابت به حروف کوچک و بزرگ حساس است؛ می‌توان آن را با استفاده از پارامتر سوم اختیاری غیرفعال کرد، مانند این:

"; echo neW1; ?>

خواهید دید که همه چیز کار می کند (در مثال قبلی کار نمی کند، زیرا به حروف کوچک و بزرگ حساس است).

به گیومه هایی که نام ثابت در آن نوشته شده دقت کنید. این کار باید انجام شود. همچنین، نمی توانید ثابت هایی با نام های مشابه ایجاد کنید.

در PHP می توانید با استفاده از تابع بررسی کنید که آیا ثابت وجود دارد یا خیر تعریف شده (نام ثابت). بیایید برای روشن شدن موضوع به یک مثال نگاه کنیم:

این مثال را تایپ کنید و ببینید چه اتفاقی می افتد.

(PHP 5 >= 5.3.0، PHP 7)

این لیست از سوالات به دو بخش تقسیم می شود: سوالات عمومی و برخی از مشخصات اجرایی که برای درک کاملتر مفید است.

اول سوالات عمومی

  1. اگر من از فضاهای نام استفاده نکنم، آیا هر یک از اینها باید مهم تلقی شود؟
  2. چگونه از کلاس های داخلی یا جهانی در فضای نام استفاده کنم؟
  3. چگونه از توابع کلاس در فضای نام یا ثابت ها در فضای نام خود استفاده کنم؟
  4. اسمش چطوره \نام منیا \نامتبدیل شده است؟
  5. مانند یک نام مانند نام منتبدیل شده است؟
  6. مانند یک نام کلاس بدون صلاحیت مانند نامتبدیل شده است؟
  7. مانند یک نام تابع ناموفق یا یک نام ثابت ناموفق مانند نامتبدیل شده است؟

برخی از جزئیات پیاده سازی فضای نام که درک آنها مفید است.

  1. نام های وارد شده نمی توانند با کلاس های تعریف شده در همان فایل تداخل داشته باشند.
  2. نه توابع و نه ثابت را نمی توان با استفاده از عملگر وارد کرد استفاده کنید.
  3. نام‌های فضای نام پویا (شناسه‌های محصور در نقل قول) باید از کاراکتر بک اسلش فرار کنند.
  4. شما نمی توانید با استفاده از بک اسلش به ثابت های تعریف نشده رجوع کنید. یک خطای کشنده نمایش داده می شود
  5. نمی‌توان ثابت‌های خاصی مانند NULL، TRUE، FALSE، ZEND_THREAD_SAFE یا ZEND_DEBUG_BUILD را لغو کرد.

اگر من از فضاهای نام استفاده نکنم، آیا هر یک از اینها باید مهم تلقی شود؟

خیر فضاهای نام هیچ تأثیری روی کدهای موجود به هر شکلی یا روی هر کدی که حاوی فضای نام نیست، ندارد. در صورت تمایل می توانید کدهای زیر را بنویسید:

مثال شماره 1 دسترسی به کلاس های سراسری خارج از فضای نام

$a = new \ stdClass ;
?>

این از نظر عملکردی معادل موارد زیر است:

مثال شماره 2 دسترسی به کلاس های سراسری خارج از فضای نام

$a = stdClass جدید ;
?>

چگونه از کلاس های داخلی یا جهانی در فضای نام استفاده کنم؟

مثال شماره 3 دسترسی به کلاس های داخلی در فضاهای نام

فضای نام foo ;
$a = new \ stdClass ;

تست تابع (\ArrayObject $type hintexample = null) ()

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// گسترش کلاس داخلی یا جهانی
کلاس MyException گسترش می یابد\Exception()
?>

چگونه از توابع کلاس در فضای نام یا ثابت در فضای نام خود استفاده کنم؟

مثال شماره 4 دسترسی به کلاس های داخلی، توابع یا ثابت ها در فضای نام

فضای نام foo ;

کلاس MyClass()

// از یک کلاس از فضای نام فعلی استفاده کنید
تست تابع (MyClass $type hintexample = null ) ()
// راه دیگری برای استفاده از یک کلاس از فضای نام فعلی
تست تابع (\foo\MyClass $typehintexample = null)()

// گسترش یک کلاس از فضای نام فعلی
class Extended MyClass() را گسترش می دهد

// دسترسی به عملکرد جهانی
$a = \globalfunc();

// دسترسی به ثابت جهانی
$b = \INI_ALL ;
?>

اسمش چطوره \نام منیا \نامتبدیل شده است؟

نام هایی که با آن شروع می شوند \ همیشه به چیزی تبدیل می شوند که به نظر می رسند، یعنی. \نام من- در واقع این است نام من، و \استثنا- این استثنا.

مثال شماره 5 اسامی مطلق

فضای نام foo ;
$a = new \ my \ name (); // یک نمونه از کلاس "my\name" ایجاد می کند
echo\strlen("سلام"); // تابع "strlen" را فراخوانی می کند
$a = \INI_ALL ; // به متغیر $a مقدار ثابت "INI_ALL" اختصاص داده شده است.
?>

مانند یک نام مانند نام منتبدیل شده است؟

نام هایی که حاوی بک اسلش هستند اما با آن شروع نمی شوند، مانند نام من

مننام دیگر، سپس این مترادف به من V نام من.

نام من.

مثال شماره 6 نام های کامل

فضای نام foo ;
استفاده از blah \ blah به عنوان foo ;

$a = my\name(); // یک نمونه از کلاس "foo\my\name" ایجاد می کند
foo\bar::name(); // متد استاتیک را "name" در کلاس "blah\blah\bar" فراخوانی می کند.
my\bar(); // تابع "foo\my\bar" را فراخوانی می کند.
$a = my\BAR; // به متغیر $a مقدار ثابت "foo\my\BAR" را اختصاص می دهد.
?>

مانند یک نام کلاس بدون صلاحیت مانند نامتبدیل شده است؟

نام کلاس هایی که حاوی بک اسلش نیستند، مانند نامرا می توان به دو روش مختلف تبدیل کرد.

اگر عبارت واردکننده ای وجود داشته باشد که مترادف ایجاد کند نامنام دیگری، سپس این مترادف استفاده می شود.

در غیر این صورت، نام فضای نام فعلی به پیشوند تبدیل می شود نام من.

مثال شماره 7 نام کلاس های فاقد صلاحیت

فضای نام foo ;
استفاده از blah \ blah به عنوان foo ;

$a = new name(); // یک نمونه از کلاس "foo\name" ایجاد می کند
foo::name(); // متد استاتیک را "name" در کلاس "blah\blah" فراخوانی می کند.
?>

مانند یک نام تابع ناموفق یا یک نام ثابت ناموفق مانند نامتبدیل شده است؟

نام توابع یا ثابت هایی که حاوی بک اسلش نیستند، مانند نامرا می توان به دو روش مختلف تبدیل کرد.

ابتدا به نام فضای نام فعلی پیشوند داده می شود نام.

سپس اگر ثابت یا تابع نامبا استفاده از یک ثابت یا تابع سراسری، در فضای نام فعلی وجود ندارد نام، اگر وجود داشته باشد.

مثال #8 نام های ثابت یا تابع ناقص

فضای نام foo ;
استفاده از blah \ blah به عنوان foo ;

const FOO = 1 ;

تابع my()()
function foo()()
مرتب‌سازی تابع (&$a)
{
\ sort ($a); // تابع سراسری را "مرتب" می خواند
$a = array_flip ($a);
بازگشت $a ;
}

من(); // "foo\my" را صدا می کند
$a = strlen("سلام"); // تابع سراسری "strlen" را صدا می کند زیرا "foo\strlen" وجود ندارد
$arr = آرایه (1, 3, 2);
$b = sort($arr); // تابع "foo\ sort" را فراخوانی می کند.
$c = foo(); // تابع "foo\foo" را فراخوانی می کند - import اعمال نمی شود

$a = FOO ; // به متغیر $a مقدار ثابت "foo\FOO" را اختصاص می دهد - import اعمال نمی شود
$b = INI_ALL ; // به متغیر $b مقدار ثابت جهانی "INI_ALL" را اختصاص می دهد.
?>

نام های وارد شده نمی توانند با کلاس های تعریف شده در همان فایل تداخل داشته باشند.

ترکیب های اسکریپت زیر معتبر هستند:

فضای نام my\stuff;
کلاس MyClass()
?>

فضای نام دیگری ;
چیز کلاس ()
?>

فضای نام my\stuff;
شامل "file1.php";
شامل " Another.php " ;


$a = MyClass جدید ; // یک نمونه از کلاس "thing" از فضای نام "ather" ایجاد می کند.
?>

با وجود کلاس هیچ تضاد نامی وجود ندارد کلاس مندرون یک فضای نام وجود دارد وسایل منزیرا تعریف MyClass در یک فایل جداگانه است. با این حال، مثال زیر یک خطای تضاد نام مهلک ایجاد می کند زیرا کلاس MyClass در همان فایلی که دستور use در آن قرار دارد، تعریف شده است.

فضای نام my\stuff;
از چیز دیگری به عنوان MyClass استفاده کنید.
کلاس MyClass() // خطای مهلک: MyClass با عبارت import تداخل دارد
$a = MyClass جدید ;
?>

فضای نام تو در تو مجاز نیست.

PHP اجازه نمی دهد که فضاهای نام درون یکدیگر قرار بگیرند

فضای نام my\stuff(
فضای نام تو در تو (
کلاس فو ()
}
}
?>

با این حال، برای شبیه سازی فضاهای نام تودرتو مانند این:

فضای نام my\stuff\nested (
کلاس فو ()
}
?>

قبل از PHP 5.6، نه توابع و نه ثابت نمی توانستند با استفاده از اپراتور وارد شوند استفاده کنید.

قبل از PHP 5.6 تنها عناصری که توسط اپراتور تحت تأثیر قرار می گیرند هستند استفاده کنیدفضاهای نام و نام کلاس ها هستند. برای کوتاه کردن نام های ثابت یا تابع طولانی، محتویات آنها را در فضای نام وارد کنید.

فضای نام معدن ;
استفاده از ultra\long\ns\name;

$a = نام \ CONSTANT ;
name\func();
?>

از زمان PHP 5.6، امکان وارد کردن و ایجاد نام مستعار برای توابع و نام های ثابت فراهم شده است.

نام‌های فضای نام پویا (شناسه‌های محصور در نقل قول) باید از کاراکتر بک اسلش فرار کنند.

نشان دادن این امر بسیار مهم است زیرا بک اسلش به عنوان یک کاراکتر فرار در رشته ها استفاده می شود. هنگام استفاده در یک رشته باید همیشه تکرار شود، در غیر این صورت خطر عواقب ناخواسته وجود دارد:

مثال 9 مشکلات هنگام استفاده از نام فضای نام در یک رشته با نقل قول دوبل

$a = "خطرناک\name" ; // \n یک خط جدید در یک رشته دو نقل قول است!
$obj = $a جدید ;

$a = "نه\ اصلا\ خطرناک نیست" ; // اینجا مشکلی نیست
$obj = $a جدید ;
?>

در رشته های تک نقل قول، بک اسلش به عنوان جداکننده ایمن تر است، اما روش توصیه شده برای فرار از بک اسلش در همه رشته ها همچنان بهترین روش است.

شما نمی توانید با استفاده از بک اسلش به ثابت های تعریف نشده رجوع کنید. یک خطای کشنده نمایش داده می شود

هر ثابت تعریف نشده ای که نامی نامشخص است، مانند FOO، به پیامی مبنی بر این که PHP چنین فرض کرده است منجر می شود FOOمقدار ثابت بود. هر ثابت، با نام واجد شرایط یا مطلق، که حاوی یک کاراکتر بک اسلش باشد، در صورت یافتن نشدن، منجر به خطای مرگبار می شود.

مثال #10 ثابت های تعریف نشده

نوار فضای نام؛
$a = FOO ; // یک اخطار نمایش می دهد: ثابت های تعریف نشده "FOO" "FOO" را فرض می کنند.
$a = \FOO ; // خطای مهلک: فضای نام تعریف نشده ثابت FOO
$a = Bar\FOO; // خطای مرگبار: نوار ثابت فضای نام تعریف نشده\Bar\FOO
$a = \Bar \FOO ; // خطای مهلک: فضای نام تعریف نشده ثابت Bar\FOO
?>

نمی‌توان ثابت‌های خاصی مانند NULL، TRUE، FALSE، ZEND_THREAD_SAFE یا ZEND_DEBUG_BUILD را لغو کرد.

هر تلاشی برای تعریف یک ثابت فضای نام که با نام ثابت های داخلی خاص مطابقت داشته باشد منجر به یک خطای مرگبار می شود.

مثال #11 ثابت های تعریف نشده

نوار فضای نام؛
const NULL = 0 ; // خطای مهلک؛
const true = "احمق" ; // همچنین خطای مرگبار.
// و غیره.
?>

7 سال پیش

راهی برای تعریف یک ثابت فضای نام وجود دارد که یک ثابت خاص و داخلی است، با استفاده از تابع define و تنظیم پارامتر سوم case_insensitive روی false:

فضای نام foo ;
تعریف کنید (__NAMESPACE__ . "\NULL" , 10 ); // ثابت NULL را در فضای نام فعلی تعریف می کند


?>

نیازی به تعیین فضای نام در فراخوانی برای define() نیست، همانطور که معمولاً اتفاق می افتد
فضای نام foo ;
define(INI_ALL، "نوار"); // اعلامیه تولید می کند - ثابت INI_ALL قبلاً تعریف شده است. ولی:

تعریف کنید (__NAMESPACE__ . "\INI_ALL" , "bar" ); // ثابت INI_ALL را در فضای نام فعلی تعریف می کند
var_dump (INI_ALL)؛ // رشته (3) "bar" را نشان خواهد داد. هیچ چیز نامعلومی تا الان ولی:

Define ("NULL"، 10); // ثابت NULL را در فضای نام فعلی تعریف می کند...
var_dump (NULL); // 10 را نشان خواهد داد
var_dump(null); // NULL را نشان خواهد داد
?>

اگر پارامتر case_insensitive روی true تنظیم شود
فضای نام foo ;
تعریف کنید (__NAMESPACE__ . "\NULL" , 10 , true ); // اعلامیه تولید می کند - تهی ثابت قبلاً تعریف شده است
?>

3 سال پیش

هنگام ایجاد کلاس ها یا فراخوانی متدهای استاتیک از داخل فضاهای نام با استفاده از متغیرها، باید به خاطر داشته باشید که آنها به فضای نام کامل نیاز دارند تا از کلاس مناسب استفاده شود. شما نمی توانید از نام مستعار یا کوتاه استفاده کنید، حتی اگر در همان فضای نام خوانده شود. غفلت از در نظر گرفتن این موضوع می‌تواند باعث شود کد شما از کلاس اشتباه استفاده کند، یک استثناء کلاس از دست رفته مهلک ایجاد کند، یا خطاها یا هشدارهایی را ایجاد کند.

در این موارد، می توانید از ثابت جادویی __NAMESPACE__ استفاده کنید، یا فضای نام کامل و نام کلاس را مستقیماً مشخص کنید. تابع class_exists همچنین به فضای نام کامل و نام کلاس نیاز دارد و می‌تواند برای اطمینان از اینکه خطای مهلکی به دلیل کلاس‌های از دست رفته ایجاد نمی‌شود، استفاده شود.

فضای نام foo ;
نوار کلاس(
تست تابع استاتیک عمومی() (
بازگشت get_called_class();
}
}

فضای نام Foo\Foo;
نوار کلاس \ Foo \ Bar (
}

Var_dump(Bar::test()); // رشته (11) "Foo\Foo\Bar"

$bar = "Foo\Bar" ;
var_dump($bar::test()); // رشته (7) "Foo\Bar"

$bar = __NAMESPACE__ . "\بار" ؛
var_dump($bar::test()); // رشته (11) "Foo\Foo\Bar"

$bar = "نوار" ;
var_dump($bar::test()); // FATAL ERROR: کلاس "Bar" یافت نشد یا کلاس \Bar نادرست استفاده شد

در این یادداشت در مورد ثابت ها صحبت خواهیم کرد. طبق معمول، بیایید به مفهوم ثابت ها در زبان های برنامه نویسی نگاهی بیندازیم و ببینیم که چگونه آنها را اعلان و استفاده می کنند. ثابت ها در PHP.

مفهوم ثابت و ثابت در PHP

کلمه ثابت باید قبلاً از ریاضیات برای شما آشنا باشد:

«ثابت ریاضی- کمیتی که مقدار آن تغییر نمی کند.

در PHP هم همینطور است. ثابت در PHPشناسه ای است که برای تعیین یک مقدار ساده (رشته، تعدادی عدد) که نمی تواند در طول اجرای کد تغییر کند، خدمت می کند.

برای اعلام یک ثابت (تخصیص یک مقدار به آن)، از تابع استفاده کنید تعريف كردن. مثالی از اعلان ثابت:

نام‌های ثابت در PHP به حروف بزرگ و کوچک حساس هستند، بنابراین باید مراقب باشید. همچنین یک قرارداد وجود دارد که اسامی ثابت همیشه با حروف بزرگ نوشته می شوند.

نام ثابت باید با یک حرف یا زیرخط "_" شروع شود و می تواند شامل حروف، اعداد و زیرخط باشد.

بیایید به یک مثال ساده از استفاده از یک ثابت نگاه کنیم:

در این مثال یک ثابت اعلام کردیم و در برنامه از آن استفاده کردیم.

ثابت ها برای چه مواردی استفاده می شوند و آیا استفاده از متغیرها آسان تر نیست؟

همانطور که قبلا ذکر شد، ثابت ها نمی توانند مقادیر خود را در طول اجرای برنامه تغییر دهند. ثابت ها معمولاً پارامترهای دائمی سایت مانند جزئیات دسترسی به پایگاه داده (میزبان، ورود کاربر و رمز عبور، نام پایگاه داده)، مکان سایت روی دیسک و بسیاری از تنظیمات دیگر را ذخیره می کنند.

اگر از متغیرها استفاده کنیم، ممکن است اسکریپت به طور تصادفی (در صورت بروز خطا) مقدار متغیر را تغییر دهد و آنطور که شما مد نظر شماست کار نخواهد کرد.

استفاده از ثابت ها تضمین می کند که مقداری که هنگام اعلام ثابت مشخص می کنید بدون تغییر باقی می ماند.

آخرین به روز رسانی: 11/1/2015

ثابت ها مانند متغیرها مقدار خاصی را ذخیره می کنند، اما بر خلاف متغیرها، مقدار ثابت ها را می توان تنها یک بار تنظیم کرد و سپس نمی توانیم آن را تغییر دهیم. به عنوان مثال، اجازه دهید یک ثابت عددی را تعریف کنیم:

برای تعریف یک ثابت، از عملگر define استفاده کنید که به شکل زیر است: define(string $name، string $value، bool $case_sen=false) . پارامتر $name نام ثابت و پارامتر $value مقدار آن را می‌رساند. سومین پارامتر اختیاری مقدار بولی true یا false را می گیرد. اگر مقدار نادرست باشد، هنگام استفاده از یک ثابت، حروف آن در نظر گرفته می شود و اگر درست است، بزرگ و کوچک در نظر گرفته نمی شود. در مورد ما، پارامتر سوم استفاده نمی شود، بنابراین به طور پیش فرض نادرست است.

پس از تعریف یک ثابت، می‌توانیم مانند یک متغیر معمولی از آن استفاده کنیم. تنها استثنا این است که ما نمی توانیم مقدار آن را تغییر دهیم. تفاوت دیگر با یک متغیر این است که شما نیازی به استفاده از علامت $ ندارید. یعنی عبارت NUMBER=33; کار نخواهد کرد

ثابت های از پیش تعریف شده

علاوه بر ثابت های ایجاد شده توسط برنامه نویس، PHP چندین ثابت داخلی دارد:

    FILE__: مسیر کامل و نام فایل فعلی را ذخیره می کند

    LINE__ : شماره خط فعلی را که مترجم در حال پردازش است ذخیره می کند

    DIR__: دایرکتوری فایل جاری را ذخیره می کند

    FUNCTION__: نام تابع در حال پردازش

    CLASS__: نام کلاس فعلی

    METHOD__: نام روش در حال پردازش

    NAMESPACE__: نام فضای نام فعلی

به عنوان مثال، بیایید خط فعلی در حال اجرا و نام فایل را چاپ کنیم:

بررسی وجود یک ثابت

برای بررسی اینکه آیا یک ثابت تعریف شده است، می توانیم از تابع bool defined (string $name) استفاده کنیم. اگر ثابت $name تعریف شده باشد، تابع true خواهد شد

ثابت ها شناسه (نام) مقادیر ساده هستند. بر اساس نام آنها، به راحتی می توان فهمید که مقدار آنها در طول اجرای اسکریپت تغییر نمی کند (استثناها ثابت های "جادویی" هستند که در واقع ثابت به معنای کامل کلمه نیستند). نام های ثابت به حروف کوچک و بزرگ حساس هستند. طبق قرارداد، نام های ثابت همیشه با حروف بزرگ نوشته می شوند.

نام یک ثابت باید از قوانین مشابه با نام های دیگر در PHP پیروی کند. نام معتبر با یک حرف یا زیرخط شروع می شود و از حروف، اعداد و زیرخط تشکیل شده است. یک عبارت منظم برای بررسی صحت یک نام ثابت به صورت زیر است: *

اظهار نظر: مفهوم "حروف" در اینجا کاراکترهای a-z، A-Z و کاراکترهای دیگر با کدهای ASCII از 127 تا 255 (0x7f-0xff) است.

نحو

می توانید با استفاده از تابع define() یا با استفاده از یک کلمه کلیدی یک ثابت تعریف کنید پایانخارج از اعلان کلاس از PHP 5.3.0. هنگامی که یک ثابت تعریف می شود، مقدار آن را نمی توان تغییر داد یا باطل کرد.

ثابت ها فقط می توانند حاوی داده های اسکالر (انواع بولی، عدد صحیح، شناور و رشته ای) باشند. همچنین می‌توان از نوع ثابت‌هایی تعریف کرد، اما باید از این کار اجتناب کرد زیرا ممکن است منجر به نتایج غیرمنتظره شود.

شما می توانید مقدار یک ثابت را با تعیین نام آن بدست آورید. بر خلاف متغیرها، شما نیازی نیستقبل از نام ثابت با یک علامت $ . همچنین اگر نام ثابت را به صورت پویا تولید می کنید، می توانید از تابع ()constant برای بدست آوردن مقدار یک ثابت استفاده کنید. از تابع get_defined_constants() برای دریافت لیستی از تمام ثابت های اعلام شده استفاده کنید.

اظهار نظر: ثابت ها و متغیرهای (جهانی) در فضاهای نام مختلف هستند. این بدان معناست که برای مثال، درست است، واقعیو $TRUE چیزهای کاملا متفاوتی هستند.

اگر از یک ثابت تعریف‌نشده استفاده می‌کنید، PHP فرض می‌کند که منظور شما نام ثابت است، گویی که یک رشته به معنای واقعی کلمه (CONSTANT به جای "CONSTANT") تعیین کرده‌اید. این یک خطای سطح E_NOTICE ایجاد می کند. همچنین به فصل دستی مراجعه کنید که توضیح می دهد چرا $foo اشتباه است (البته مگر اینکه ابتدا آن را اعلام کرده باشید). باربه عنوان یک ثابت با استفاده از define()). اگر فقط می خواهید بررسی کنید که آیا یک ثابت تعریف شده است یا خیر، از تابع defined() استفاده کنید.

تفاوت بین ثابت ها و متغیرها:

  • ثابت ها پیشوند علامت دلار ندارند ( $ );
  • ثابت ها را فقط می توان با استفاده از تابع define() تعریف کرد، نه با اختصاص یک مقدار.
  • ثابت ها را می توان در هر جایی بدون توجه به محدوده تعریف کرد و به آنها دسترسی داشت.
  • ثابت ها را نمی توان پس از اعلام اولیه آنها دوباره تعریف کرد یا باطل کرد. و
  • ثابت ها فقط می توانند مقادیر اسکالر داشته باشند.

ثابت های "جادویی".

PHP لیست بزرگی از ثابت های از پیش تعریف شده را برای هر اسکریپتی که اجرا می کنید ارائه می کند. بسیاری از این ثابت ها توسط ماژول های مختلف تعریف می شوند و تنها در صورتی وجود خواهند داشت که آن ماژول ها از طریق بارگذاری پویا یا از طریق مونتاژ استاتیک در دسترس باشند.

هفت ثابت جادویی وجود دارد که بسته به زمینه ای که در آن استفاده می شود، معنای آنها تغییر می کند. به عنوان مثال، ارزش __LINE__بستگی به خطی در اسکریپت دارد که این ثابت روی آن مشخص شده است. ثابت های ویژه به حروف بزرگ و کوچک حساس نیستند و در زیر فهرست شده اند:

برخی از ثابت های "جادویی" PHP
نام شرح
__LINE__ شماره خط فعلی در فایل.
__فایل__ مسیر کامل و نام فایل فعلی. در صورت استفاده در داخل یک فایل همراه، نام این فایل برگردانده می شود. از آنجایی که PHP نسخه 4.0.2، __فایل__همیشه حاوی یک مسیر مطلق با پیوندهای نمادین مجاز است، در حالی که نسخه‌های قدیمی‌تر در برخی شرایط یک مسیر نسبی را برمی‌گردانند.
__DIR__ دایرکتوری فایل. در صورت استفاده در داخل یک فایل همراه، دایرکتوری آن فایل برگردانده می شود. این معادل تماس است dirname(__FILE__). نام دایرکتوری برگشتی به اسلش ختم نمی شود، به استثنای دایرکتوری ریشه (افزوده شده در PHP 5.3.0.)
__تابع__ نام تابع (در PHP 4.3.0 اضافه شده است.) از PHP 5، این ثابت نام تابع را دقیقاً همانطور که اعلام شده است (حساس به حروف کوچک و بزرگ) برمی گرداند. در PHP 4 این مقدار همیشه کوچک بود.
__کلاس__ نام کلاس. (در PHP 4.3.0 اضافه شده است) از آنجایی که PHP 5، این ثابت نام کلاس را دقیقاً همانطور که اعلام شده است برمی گرداند (حساس به حروف کوچک و بزرگ). در PHP 4 این مقدار همیشه کوچک بود. نام کلاس حاوی نام فضای نامی است که کلاس در آن اعلان شده است (به عنوان مثال، Foo\ Bar). لطفاً توجه داشته باشید که از آنجایی که PHP5.4 __CLASS__ نیز در ویژگی ها کار می کند. هنگامی که در متدهای صفت استفاده می شود، __CLASS__ نام کلاسی است که متدها در آن استفاده می شوند.
__TRAIT__ نام صفت (در PHP 5.4.0 اضافه شده است) از PHP 5.4، این ثابت نام صفت را دقیقاً همانطور که اعلام شده است (حساس به حروف کوچک و بزرگ) برمی گرداند. این نام شامل فضای نامی است که صفت در آن اعلام شده است (به عنوان مثال، Foo\ Bar).
__روش__ نام متد کلاس. (اضافه شده در PHP 5.0.0) نام متد همانطور که اعلام شده بود برگردانده می شود (حساس به حروف بزرگ).
__NAMESPACE__ نام فضای نام فعلی (حساس به حروف کوچک و بزرگ). این ثابت در زمان کامپایل تعیین می شود (افزوده شده در PHP 5.3.0).
مثال شماره 1 نام های ثابت صحیح و نادرست
// نام‌های ثابت صحیح define("FOO", "something"); define("FOO2"، "چیز دیگری"); define("FOO_BAR"، "چیزی بیشتر"); // نام های ثابت نادرست define("2FOO", "something"); // این یک اعلان معتبر است، اما بهتر است از آن استفاده نکنید: // PHP ممکن است روزی یک ثابت "جادویی" // ثبت کند که اسکریپت شما را تعریف کند("__FOO__", "something");