الثوابت في الكلاسات
جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 16 من 91.
في بعض الأحيان تحتاج إلى قيم في class لا يجب أن تتغير أبداً. توفر Class constants طريقة لتعريف قيم ثابتة تظل كما هي عبر جميع instances ولا يمكن تعديلها بعد التصريح عنها.
تقوم بتعريف ثابت باستخدام الكلمة المفتاحية const داخل الفئة (class). حسب العرف، تُكتب أسماء الثوابت بأحرف كبيرة (uppercase):
<?php
class Circle {
const PI = 3.14159;
public $radius;
public function __construct($radius) {
$this->radius = $radius;
}
public function area() {
return self::PI * $this->radius * $this->radius;
}
}
$circle = new Circle(5);
echo $circle->area();
المخرجات:
78.53975مثل الخصائص الثابتة (static properties)، تنتمي الثوابت إلى الفئة (class) بدلاً من الكائنات الفردية. يمكنك الوصول إليها باستخدام self::CONSTANT_NAME داخل الفئة أو ClassName::CONSTANT_NAME من الخارج:
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK . "\n";
echo HttpStatus::NOT_FOUND;
المخرجات:
200
404نقطة رئيسية: على عكس الخصائص الساكنة (static properties)، لا يمكن تغيير الثوابت بمجرد تعريفها. فهي مثالية للقيم التي يجب أن تظل ثابتة طوال تطبيقك، مثل قيم الإعدادات، أو أكواد الحالة، أو الثوابت الرياضية.
التحدي
سهللنقم ببناء أداة لتحويل درجات الحرارة تستخدم ثوابت الفئات (class constants) لتخزين قيم التحويل الثابتة التي لا تتغير أبداً.
ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:
Temperature.php— قم بتعريف فئةTemperatureالتي تتعامل مع تحويلات درجات الحرارة. يجب أن تحتوي الفئة على ثلاثة ثوابت:FREEZING_POINT_Cوقيمته0، وBOILING_POINT_Cوقيمته100، وCONVERSION_FACTORوقيمته1.8(يُستخدم للتحويل من مئوي إلى فهرنهايت). قم بتضمين خاصيةpublic $celsiusومنشئ (constructor) يقبل ويضبط القيمة المئوية. أضف تابعاً باسمtoFahrenheit()يقوم بتحويل درجة الحرارة المئوية المخزنة إلى فهرنهايت باستخدام الصيغة:(celsius * CONVERSION_FACTOR) + 32. أضف أيضاً تابعاً باسمgetStatus()يعيد"Freezing"إذا كانت درجة الحرارة تساوي ثابت نقطة التجمد، أو"Boiling"إذا كانت تساوي ثابت نقطة الغليان، أو"Normal"في الحالات الأخرى.main.php— قم بتضمين ملف فئة Temperature. أنشئ ثلاثة كائنات (objects) من Temperature بالقيم0و100و25. لكل درجة حرارة، اطبع تحويل الفهرنهايت متبوعاً بالحالة في نفس السطر بهذا التنسيق:"[fahrenheit]F - [status]". يجب أن تكون كل درجة حرارة في سطر مستقل. بعد طباعة الثلاثة جميعاً، قم بالوصول إلى ثابتBOILING_POINT_Cمباشرة من الفئة (باستخدامTemperature::BOILING_POINT_C) واطبعه في سطر جديد.
تذكر أنه يتم الوصول إلى الثوابت باستخدام self::CONSTANT_NAME داخل الفئة و ClassName::CONSTANT_NAME من خارجها. على عكس الخصائص، لا تستخدم الثوابت رمز $ عند الوصول إليها.
ورقة مرجعية
ثوابت الفئة (Class constants) هي قيم ثابتة لا تتغير أبداً وتتم مشاركتها عبر جميع مثيلات الفئة. قم بتعريفها باستخدام الكلمة المفتاحية const:
<?php
class Circle {
const PI = 3.14159;
public function area($radius) {
return self::PI * $radius * $radius;
}
}
قم بالوصول إلى الثوابت باستخدام self::CONSTANT_NAME داخل الفئة:
return self::PI * $radius * $radius;
قم بالوصول إلى الثوابت باستخدام ClassName::CONSTANT_NAME من خارج الفئة:
echo Circle::PI;
الاختلافات الرئيسية عن الخصائص الثابتة (static properties):
- لا يمكن تغيير الثوابت بعد التصريح عنها
- لا تستخدم الثوابت رمز
$ - الثوابت مثالية للقيم الثابتة مثل إعدادات التكوين، أو رموز الحالة، أو الثوابت الرياضية
حسب العرف، تُكتب أسماء الثوابت بأحرف كبيرة (uppercase):
<?php
class HttpStatus {
const OK = 200;
const NOT_FOUND = 404;
const SERVER_ERROR = 500;
}
echo HttpStatus::OK; // 200
جرّب بنفسك
<?php
require_once 'Temperature.php';
// TODO: قم بإنشاء ثلاثة كائنات Temperature بالقيم 0 و 100 و 25
// TODO: لكل درجة حرارة، قم بالطباعة بالتنسيق: "[fahrenheit]F - [status]"
// كل درجة حرارة في سطر مستقل
// TODO: قم بالوصول إلى الثابت BOILING_POINT_C وطباعته مباشرة من الفئة
// استخدم صيغة ClassName::CONSTANT_NAME
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس Object Oriented Programming
1أساسيات OOP
الملفات الخارجيةمقدمة في OOPClasses مقابل Objectsالكلمة المفتاحية $thisالـ Methodsالـ Propertiesالمنشئ (__construct)الهادم (__destruct)مراجعة - آلة حاسبة بسيطة4الوراثة
الوراثة الأساسيةالكلمة المفتاحية parent::إعادة تعريف الدوال (Method Overriding)الكلمة المفتاحية finalالأصناف المجردة (Abstract Classes)مراجعة - هيكلية الموظفين7التغليف (Encapsulation)
العام، المحمي، الخاص (Public, Protected, Private)نظرة متعمقة على معدلات الوصولدوال Getters و Settersإخفاء المعلوماتميزة Constructor Promotion (8.0)مراجعة - نظام سجلات الطلاب10مفاهيم البرمجة كائنية التوجه المتقدمة
التركيب مقابل الوراثةحقن التبعيةالأصناف المجهولةالتعدادات (PHP 8.1)الألياف (PHP 8.1)تعمق في استنساخ الكائناتالمولدات والمكررات13أنماط التصميم - الجزء الثاني
نمط الأمرنمط المحولنمط المزيننمط طريقة القالبنمط الحالةنمط التركيبنمط المستودع2مساحات الأسماء والتحميل التلقائي
مقدمة إلى مساحات الأسماءالكلمة المفتاحية useمعيار التحميل التلقائي PSR-4أداة التحميل التلقائي Composerملخص - مشروع منظم5الواجهات والعقود
مقدمة إلى الواجهاتتنفيذ الواجهاتتنفيذ واجهات متعددةالواجهة مقابل الـ Abstract Classالـ Type Hinting مع الواجهاتملخص - حاسبة الأشكال8الميثودات السحرية (Magic Methods)
مقدمة في الميثودات السحرية__toString و __debugInfo__get, __set, __isset, __unset__call و __callStatic__clone واستنساخ الكائنات__serialize و __unserializeمراجعة - Custom Collection3خصائص الكلاس
خصائص الـ Instance مقابل الخصائص الساكنة (Static)الثوابت في الكلاساتالدوال والخصائص الساكنة (Static)الخصائص الخاصة (Private) والمحمية (Protected)خصائص للقراءة فقط (Readonly) في PHP 8.1مراجعة - مدير الحساب البنكي6تعدد الأشكال (Polymorphism)
مراجعة إعادة تعريف الدوال (Method Overriding)تعدد الأشكال عبر الـ Interfacesتلميح النوع (Type Hinting) وأنواع الاتحاد (Union Types)الربط الاستاتيكي المتأخر (Late Static Binding)ملخص - معالج الدفع (Payment Processor)