الدوال والخصائص الساكنة (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).
التحدي
سهللنقم ببناء نظام لتوليد المعرفات (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: اطبع رقم المعرف الأخير باستخدام الطريقة الثابتة المناسبة
?>يتضمن هذا الدرس اختبارًا قصيرًا. ابدأ الدرس للإجابة عليه وتتبّع تقدمك.
جميع دروس 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)