Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

الثوابت في الكلاسات

جزء من قسم 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)، لا يمكن تغيير الثوابت بمجرد تعريفها. فهي مثالية للقيم التي يجب أن تظل ثابتة طوال تطبيقك، مثل قيم الإعدادات، أو أكواد الحالة، أو الثوابت الرياضية.

challenge icon

التحدي

سهل

لنقم ببناء أداة لتحويل درجات الحرارة تستخدم ثوابت الفئات (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

?>
quiz iconاختبر نفسك

يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.

جميع دروس Object Oriented Programming