اذهب إلى المحتوى
  • 0

ما هي التوابع الساكنة Static Methods في البرمجة الكائنية OOP في PHP؟

Emad Saif

السؤال

لاحظت أنه يمكن عمل توابع بأكثر من طريقة في الصنف الواحد Class وأريد أن أعرف ما هو الفرق الأساسي بين التوابع العادية والتوابع الساكنة Static Methods؟ ومتى أستعمل كل نوع منهما؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 1

الفرق بين التوابع الساكنة Static Methods والتوابع العادية

التوابع العادية لا يمكن إستخدامها إلا من خلال إنشاء كائن Object (أو instance) من الصنف Class بالشكل التالي:

<?php
class User {
  public function SayHi() {
    echo "Hello World!";
  }
}

$user = new User(); // يجب إنشاء كائن من الصنف
$user->SayHi();

بينما التوابع الساكنة Static Methods يمكن إستدعائها مباشرة بدون الحاجة إلى إنشاء كائن جديد:

<?php
class User {
  static public function SayHi() {
    echo "Hello World!";
  }
}

// لا يجب إنشاء نسخة كائن جديد من الصنف User
User::SayHi();	// Hello World!

لاحظ في الأمثلة السابقة يجب كتابة الكلمة المفتاحية static قبل تعريف التابع لعمل تابع ساكن Static Method، ولا يوجد مشكلة في كتابة كلمة static قبل أو بعد الكلمة المفتاحية public (الكلمة المفتاحية  public في حد ذاتها إختيارية) لكن يجب كتابتها قبل الكلمة المفتاحية function، وبالتالي لا يوجد فرق بين أي من التوابع التالية:

<?php
class User {
  static public function SayHi() {
    echo "Hello World!";
  }
  
  public static function SayHi2() {
    echo "Hello World!";
  }
  
  static function SayHi3() {
    echo "Hello World!";
  }
}

// لا يجب إنشاء نسخة كائن جديد من الصنف User
User::SayHi();	// Hello World!
User::SayHi2();	// Hello World!
User::SayHi3();	// Hello World!

أيضًا لاحظ أن التوابع الساكنة Static Methods يتم إستدعائها من خلال العلامة :: بينما التوابع العادية تستخدم <- على النحو التالي:

<?php

$user->sayHi();

User::sayHi();

ملاحظة: لا يمكن استخدام المتغير الزائف ‎$this داخل التوابع الساكنة وذلك لأنّ هذه التوابع قابلة للاستدعاء دون الحاجة إلى إنشاء نسخة من الكائن.

إستعمال أكثر من نوع من التوابع معًا

يمكن أن يحتوي الصنف الواحد على توابع عادية وتوابع ساكنة معًا بدون مشكلة:

<?php
class greeting {
  public static function welcome() {
    echo "Hello World!";
  }

  public function __construct() {
    self::welcome();
  }
}

new greeting();	// "Hello World!"

أيضًا لاحظ أنه يمكن إستدعاء التوابع الساكنة Static Methods من داخل نفس الصنف (في توابع أخرى) من خلال الكلمة المفتاحية self كما في المثال السابق.

أيضًا يمكن إستدعاء تابع ساكن Static Method موجود في صنف أب من داخل صنف ابن على النحو التالي:

<?php
class User {
  protected static function sayHi() {
    return "Hello, World!";
  }
}

class Admin extends User {
  public $hello;
  public function __construct() {
    $this->hello = parent::sayHi();
  }
}

$admin = new Admin();
echo $admin -> hello;

في المثال السابق يوجد تابع ساكن موجود في الصنف User (الصنف الأب) بينما الصنف الابن Admin يستدعي التابع sayHi الموجود في الصنف الأب مباشرة عبر الكلمة المفتاحية parent.

متى يتم إستعمال التوابع الساكنة Static Methods

يتم إستعمال التوابع الساكنة في حالات قليلة، منها:

  • يمكن عمل صنف واحد يحتوي فقط على توابع ساكنة تقوم بأداة مهام متشابهة (أو تختص بأمر معين مثل إدارة الملفات على سبيل المثال). وفي هذه الحالة يمكن إعتبار التوابع الساكنة مجرد دوال عادية لكن موجودة في Namespace معين (وهو الصنف Class).
  • يمكن إستخدامها في عمل Service وهي طريقة لترشيد التعليمات البرمجية الخاصة بك. يسمى هذا النوع من الهندسة المعمارية SOA (بنية موجهة للخدمة). فتخيل أن لديك متجر إلكتروني ويجب عمل صنف SaleHandler والذي يحتوي على كل الدوال التي يجب إستخدامها في التلاعب ببيانات مبيعة معينة (في قاعدة البيانات مثلًا)، في هذه الحالة سيكون من الأفضل أن يحتوي الصنف SaleHandler على توابع ساكنة Static Methods
  • إن كنت تستعمل إطار عمل Framework مثل لارافيل Laravel فستجد أنه يتم إستعمال التوابع الساكنة في أكثر من مكان مثل عمل المسارات Routes أو توابع التعامل مع النصوص String.

يمكنك معرفة المزيد عن التوابع الساكنة Static Methods وفائدتها من خلال موسوعة حسوب من هنا.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...