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

ما الفرق بين إستخدام self و this$ في البرمجة الكائنية OOP في PHP؟

Emad Saif

السؤال

أكد في كثير من الأكواد يتم إستعمال this$ للوصول إلى توابع أو خواص من نفس الصنف، ولكن مؤخرًا قرأت بعض الأكواد التي يتم فيها إستعمال self أيضًا:

<?php
class MyClass {
    // ...

    function myMethod() {
        echo self::total_member;
    }
}

متى يجب أن أستعمل this$ ومتى أستعمل self؟

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

Recommended Posts

  • 1

الأصناف Classes في PHP يمكن أن تحتوي على خصائص أو توابع ساكنة static أو عادية (موروثة inherited)، ولكي يمكننا الوصول إلى الخصائص العادية من داخل التوابع نستعمل this$ بينما تُستعمل self للوصول إلى الخصائص الساكنة

أي أنك يجب أن تستخدم this$ للإشارة إلى الكائن الحالي Current Object. واستخدم self للإشارة إلى الصنف الحالي Current Class. بمعنى آخر ، استخدم this->member$ للتوابع غير الساكنة non-static ، واستخدم self::$member للتوابع الساكنة static.

مثال:

<?php
class MyClass
{
  // Current Class  
  
  public $normal_value = "non-static value";
  static $static_value = "static value";

  function __construct()
  {
    echo $this->normal_value	// للوصول إلى تابع أو خاصية عادية
      . ' + '
      . self::$static_value;	// للوصول إلى تابع أو خاصية ساكنة Static
  }
}


$c = new MyClass();	// Current Object
// Output: non-static value + static value

وإذا حاولت إستخدام self مكان this$ سيظهر لك الخطأ التالي:

Fatal error: Uncaught Error: Access to undeclared static property

سوف يتضح الأمر أكثر عن محاولة وراثة صنف إلى صنف آخر:

<?php
class X {
    function foo() {
        echo 'X::foo()';
    }

    function bar() {
        self::foo();	// تُشير إلى الصنف الحالي، حتى بعد الوراثة
    }
}

class Y extends X {
    function foo() {
        echo 'Y::foo()';
    }
}

$x = new Y();
$x->bar();	// X::foo()

السبب في هذه النتيجة هو أن self تُشير إلى الصنف بحد ذاته وليس الكائنات التي يتم إنشائها منه (أو حتى الأصناف التي ترث منه)، وبالتالي ستظل self في المثال السابق تُشير إلى الصنف X 

على الجانب الآخر عند إستعمال this$ سيتم الإشارة إلى الكائن Object نفسه وليس الصنف Class:

<?php
class X {
    function foo() {
        echo 'X::foo()';
    }

    function bar() {
        $this->foo();	// تُشير إلى الكائن الذي سيتم إنشائه 
    }
}

class Y extends X {
    function foo() {
        echo 'Y::foo()';
    }
}

$x = new Y();
$x->bar();	// Y::foo()

ملاحظة: يمكن إستخدام self للوصول إلى التوابع بدون مشكلة (مثل this$) تمامًا:

<?php
class Person
{
  private $name;

  public function __construct($name)
  {
    $this->name = $name;
  }

  public function getName()
  {
    return $this->name;
  }

  public function sayGoodbye()
  {
    echo "Goodbye, " . self::getName() . "<br/>";
  }
}


$p = new Person("Sameh");
$p->sayGoodbye();	// // Goodbye, Sameh

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...