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

الدوال والخصائص الساكنة (Static)

جزء من قسم Object Oriented Programming في رحلة PHP على Coddy — الدرس 17 من 91.

تماماً كما يمكن أن تكون الخصائص (properties) ساكنة (static)، يمكن للأساليب (methods) أيضاً أن تنتمي إلى الفئة (class) نفسها بدلاً من الكائنات (objects) الفردية. يتم استدعاء الأساليب الساكنة (static methods) على الفئة مباشرة، دون الحاجة إلى إنشاء مثيل (instance) أولاً.

تقوم بالتصريح عن دالة ثابتة (static method) باستخدام الكلمة المفتاحية static واستدعائها باستخدام اسم الفئة وعامل الـ :::

<?php
class MathHelper {
    public static function add($a, $b) {
        return $a + $b;
    }
    
    public static function multiply($a, $b) {
        return $a * $b;
    }
}

echo MathHelper::add(5, 3) . "\n";
echo MathHelper::multiply(4, 2);

الناتج:

8
8

تعمل الأساليب الثابتة (Static methods) بشكل جيد مع الخصائص الثابتة (static properties). ومن الأنماط الشائعة استخدام أسلوب ثابت لإدارة بيانات الفئة (class) المشتركة:

<?php
class Counter {
    private static $count = 0;
    
    public static function increment() {
        self::$count++;
    }
    
    public static function getCount() {
        return self::$count;
    }
}

Counter::increment();
Counter::increment();
echo Counter::getCount();

المخرجات:

2

لاحظ أن الدوال الثابتة لا يمكنها استخدام $this لعدم وجود مثيل للكائن. يمكنها فقط الوصول إلى الخصائص الثابتة والدوال الثابتة الأخرى باستخدام self::.

نقطة رئيسية: تُعد الدوال الثابتة (Static methods) مفيدة للدوال المساعدة التي لا تحتاج إلى حالة الكائن (object state)، أو لإدارة البيانات على مستوى الفئة (class-level). فهي توفر الوظائف دون الحاجة إلى إنشاء كائن (object instantiation).

challenge icon

التحدي

سهل

لنقم ببناء نظام لتوليد المعرفات (ID) يستخدم الأساليب (methods) والخصائص (properties) الثابتة (static) لإنشاء معرفات فريدة دون الحاجة إلى إنشاء كائنات (instantiate objects).

ستقوم بإنشاء ملفين لتنظيم الكود الخاص بك:

  • IdGenerator.php — قم بتعريف فئة IdGenerator تدير عملية توليد المعرفات الفريدة باستخدام الأعضاء الثابتة (static members) فقط. يجب أن تحتوي الفئة على خاصية ثابتة خاصة (private static property) باسم $lastId تبدأ بـ 0 وخاصية ثابتة خاصة باسم $prefix مضبوطة على "ID". قم بإنشاء أسلوب ثابت (static method) باسم generate() يقوم بزيادة المعرف الأخير وإرجاع سلسلة نصية منسقة تجمع بين البادئة (prefix) والمعرف الجديد (مثل "ID1"، "ID2"، إلخ). أضف أسلوباً ثابتاً setPrefix($newPrefix) يقوم بتغيير البادئة، وأسلوباً ثابتاً getLastId() يعيد القيمة الحالية لـ $lastId.
  • main.php — قم بتضمين ملف فئة IdGenerator. قم بتوليد معرفين باستخدام البادئة الافتراضية واطبع كل منهما في سطر منفصل. ثم قم بتغيير البادئة إلى "USER" باستخدام الأسلوب الثابت، وقم بتوليد معرفين إضافيين، واطبع كل منهما. أخيراً، اطبع رقم المعرف الأخير عن طريق استدعاء الأسلوب الثابت المناسب.

تذكر أن الأساليب الثابتة يتم استدعاؤها مباشرة على الفئة باستخدام ClassName::methodName()، وداخل الفئة يمكنك الوصول إلى الخصائص الثابتة باستخدام self::$propertyName. ونظراً لعدم وجود مثيل للكائن (object instance)، لا يمكنك استخدام $this في الأساليب الثابتة.

يجب أن يظهر مخرجك تسلسل المعرفات ببادئات مختلفة، مما يوضح كيف تحافظ الخصائص الثابتة على قيمها عبر استدعاءات متعددة للأساليب.

ورقة مرجعية

تنتمي الطرق الثابتة (Static methods) إلى الفئة نفسها ويتم استدعاؤها دون إنشاء مثيل (instance). قم بالتصريح عنها باستخدام الكلمة المفتاحية static واستدعها باستخدام اسم الفئة وعامل :::

<?php
class MathHelper {
    public static function add($a, $b) {
        return $a + $b;
    }
}

echo MathHelper::add(5, 3); // 8

يمكن للطرق الثابتة الوصول إلى الخصائص الثابتة باستخدام self:::

<?php
class Counter {
    private static $count = 0;
    
    public static function increment() {
        self::$count++;
    }
    
    public static function getCount() {
        return self::$count;
    }
}

Counter::increment();
echo Counter::getCount(); // 1

لا يمكن للطرق الثابتة استخدام $this لأنه لا يوجد مثيل للكائن (object instance). يمكنها فقط الوصول إلى الخصائص الثابتة والطرق الثابتة الأخرى باستخدام self::.

تعد الطرق الثابتة مفيدة للوظائف المساعدة (utility functions) التي لا تحتاج إلى حالة الكائن، أو لإدارة البيانات على مستوى الفئة دون الحاجة إلى إنشاء مثيل للكائن.

جرّب بنفسك

<?php

// تضمين ملف فئة IdGenerator
require_once 'IdGenerator.php';

// TODO: قم بإنشاء معرفين (IDs) باستخدام البادئة الافتراضية واطبع كل منهما في سطر منفصل

// TODO: قم بتغيير البادئة إلى "USER" باستخدام الطريقة الثابتة (static method)

// TODO: قم بإنشاء معرفين إضافيين واطبع كل منهما في سطر منفصل

// TODO: اطبع رقم المعرف الأخير باستخدام الطريقة الثابتة المناسبة

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

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

جميع دروس Object Oriented Programming