0Pricing
PHP Academy · درس

الخصائص والأساليب الساكنة

استخدموا الأعضاء الساكنة وافهموا متى تستدعونها دون إنشاء نسخة من الفئة

الخصائص والأساليب الساكنة درس مجاني في PHP Academy على CoddyKit. هذا هو الدرس 3 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في PHP Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة PHP Academy 4 دروس في المجموع.

مقدمة: الخصائص والأساليب الساكنة

تنتمي الأعضاء الساكنة إلى الصنف نفسه بدلًا من أي مثيل. يمكن الوصول إليها باستخدام ClassName::member أو self:: داخل الصنف. وهي مشتركة بين جميع المثيلات.

المفاهيم الأساسية

المفاهيم الأساسية للخصائص والأساليب الساكنة:

  • صرّحوا عنها باستخدام الكلمة المفتاحية static
  • يمكن الوصول إليها باستخدام :: (عامل تحديد النطاق)
  • استخدموا self:: داخل الصنف، وClassName:: من خارجه
  • استخدموا الربط الساكن المتأخر مع static::

خاصية ساكنة

مثال:

<?php
class AppConfig {
    private static array $settings = [];

    public static function set(string $key, mixed $val): void {
        self::$settings[$key] = $val;
    }

    public static function get(string $key, mixed $default = null): mixed {
        return self::$settings[$key] ?? $default;
    }
}

AppConfig::set('debug', true);
echo AppConfig::get('debug') ? 'debug on' : 'debug off';

دالة ساكنة

متابعة:

<?php
class MathHelper {
    public static function clamp(float $v, float $min, float $max): float {
        return max($min, min($max, $v));
    }

    public static function lerp(float $a, float $b, float $t): float {
        return $a + ($b - $a) * $t;
    }
}

echo MathHelper::clamp(150, 0, 100); // 100
echo MathHelper::lerp(0, 100, 0.5);  // 50

نمط Singleton

تدريب:

<?php
class Database {
    private static ?Database $instance = null;

    private function __construct() {
        echo 'Connected to DB';
    }

    public static function getInstance(): self {
        if (self::$instance === null) {
            self::$instance = new self();
        }
        return self::$instance;
    }
}

$db1 = Database::getInstance();  // 'Connected to DB'
$db2 = Database::getInstance();  // no output — same instance
echo ($db1 === $db2) ? 'same' : 'different'; // same

عداد ساكن

مزيد من التعمق:

<?php
class EventEmitter {
    private static int $instanceCount = 0;

    public function __construct() {
        self::$instanceCount++;
    }

    public static function count(): int {
        return self::$instanceCount;
    }
}

new EventEmitter();
new EventEmitter();
new EventEmitter();
echo EventEmitter::count();  // 3

الربط الساكن المتأخر

استخدام متقدم:

<?php
class ParentClass {
    public static function create(): static {
        return new static();  // resolves to calling subclass
    }

    public function getClass(): string {
        return static::class;  // late static binding
    }
}

class ChildClass extends ParentClass {}

$obj = ChildClass::create();
echo $obj->getClass();  // ChildClass

المصنع الساكن

نمط عملي واقعي:

<?php
class Response {
    private function __construct(
        private int   $status,
        private mixed $body
    ) {}

    public static function ok(mixed $data): self {
        return new self(200, $data);
    }

    public static function notFound(): self {
        return new self(404, ['error' => 'Not Found']);
    }

    public function toJson(): string {
        return json_encode(['status' => $this->status, 'body' => $this->body]);
    }
}

echo Response::ok(['users' => []])->toJson();

المفاضلات بين الساكن والمثيل

أفضل الممارسات:

<?php
// Static: no object needed, but harder to test/mock
class Validator {
    public static function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}

// Instance: injectable dependency, testable
class ValidatorService {
    public function isEmail(string $s): bool {
        return (bool) filter_var($s, FILTER_VALIDATE_EMAIL);
    }
}
// Prefer instance classes in larger applications

نمط عملي

جمع كل ذلك في نمط عملي للخصائص والأساليب الساكنة.

أخطاء شائعة

تجنبوا هذه الأخطاء الشائعة عند استخدام الخصائص والأساليب الساكنة:

  • الأعضاء الساكنة مشتركة بين جميع المثيلات
  • فضّلوا الربط الساكن المتأخر (static::) على self:: في الأصناف القابلة للتوريث
  • يُعد نمط Singleton شائعًا، لكنه يُستخدم بإفراط أحيانًا
  • يصعب محاكاة الدوال الساكنة في اختبارات الوحدات

تحقق سريع

ما الكلمة المفتاحية التي تصل إلى خاصية ساكنة داخل الصنف مع مراعاة الوراثة (الربط الساكن المتأخر)؟

مراجعة: الخصائص والأساليب الساكنة

لقد تعلّمتم الخصائص والأساليب الساكنة. تذكّروا النقاط الأساسية التالية:

  • الأعضاء الساكنة مشتركة بين جميع المثيلات
  • فضّلوا الربط الساكن المتأخر (static::) على self:: في الأصناف القابلة للتوريث
  • يُعد نمط Singleton شائعًا، لكنه يُستخدم بإفراط أحيانًا
  • يصعب محاكاة الدوال الساكنة في اختبارات الوحدات

الأسئلة الشائعة

هل درس «الخصائص والأساليب الساكنة» مجاني؟

نعم — نص درس «الخصائص والأساليب الساكنة» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة PHP Academy، انتقل إلى CoddyKit PRO. تتضمن دورة PHP Academy 4 دروس في المجموع.

ماذا ستتعلم في «الخصائص والأساليب الساكنة»؟

استخدموا الأعضاء الساكنة وافهموا متى تستدعونها دون إنشاء نسخة من الفئة تتمرن على PHP Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ PHP Academy؟

لا تُشترط خبرة سابقة. PHP Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 3 من أصل 4.

كم من الوقت يستغرق درس «الخصائص والأساليب الساكنة»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس PHP Academy هذا؟

نعم. كل درس في PHP Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الفئات والخصائص والأساليب
  2. المنشئات والمدمّرات
  3. الخصائص والأساليب الساكنة
  4. نظرة عامة على الأساليب السحرية
← العودة إلى PHP Academy