سؤال

لدي الفصل التالي في PHP

class MyClass
{
  // How to declare MyMember here? It needs to be private
  public static function MyFunction()
  {
    // How to access MyMember here?
  }
}

أنا مرتبك تمامًا بشأن بناء الجملة للاستخدام

$MyMember = 0; و echo $MyMember

أو

private $MyMember = 0; و echo $MyMember

أو

$this->MyMember = 0; و echo $this->MyMember

هل يمكن لأحد أن يقول لي كيف نفعل ذلك؟

أنا نوع من القوي في عفوًا.

هل يمكنك فعل ذلك في المقام الأول؟

إذا لم يكن الأمر كذلك ، كيف يجب أن أعلن العضو حتى أتمكن من الوصول إليه داخل الوظائف الثابتة؟

هل كانت مفيدة؟

المحلول

class MyClass
{
  private static $MyMember = 99;

  public static function MyFunction()
  {
    echo self::$MyMember;
  }
}

MyClass::MyFunction();

يرى الرؤية و عامل دقة النطاق (: :) في الفصل OOP5 من دليل PHP.

نصائح أخرى

هذا استجابة متأخرة للغاية ولكنه قد يساعد شخص ما ..

class MyClass
{
  private $MyMember;

  public static function MyFunction($class)
  {
    $class->MyMember = 0;
  }
}

انه يعمل انها تعمل. يمكنك الوصول إلى العضو الخاص بهذه الطريقة ، ولكن إذا كان لديك فئة $ ، فيجب عليك فقط جعل myFunction طريقة للفصل ، حيث يمكنك فقط الاتصال بـ $ class-> myFunction (). ومع ذلك ، يمكن أن يكون لديك صفيف ثابت يتم إضافته إلى كل مثيل في مُنشئ الفئة والتي يمكن أن تصل هذه الوظيفة الثابتة وتكرارها ، وتحديث جميع الحالات. بمعنى آخر..

class MyClass
{
  private $MyMember;
  private static $MyClasses;

  public function __construct()
  {
    MyClass::$MyClasses[] = $this;
  }

  public static function MyFunction()
  {
    foreach(MyClass::$MyClasses as $class)
    {
      $class->MyMember = 0;
    }
  }
}

ضمن الطرق الثابتة ، لا يمكنك الاتصال بالمتغير باستخدام $this لأن الأساليب الثابتة تسمى خارج "سياق مثيل".

وذكر بوضوح في DOC PHP.

<?php
    class MyClass
    {
        // A)
        // private $MyMember = 0;

        // B)
        private static $MyMember = 0;

        public static function MyFunction()
        {
            // using A) //  Fatal error: Access to undeclared static property: 
            //              MyClass::$MyMember
            // echo MyClass::$MyMember; 

            // using A) // Fatal error: Using $this when not in object context
            // echo $this->MyMember; 

            // using A) or B)
            // echo $MyMember; // local scope

            // correct, B) 
            echo MyClass::$MyMember;
        }
    }

    $m = new MyClass;
    echo $m->MyFunction();
    // or better ...
    MyClass::MyFunction(); 

?>

ثابت أم غير منتظم؟

هل سألت نفسك هذا السؤال من قبل؟

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

ومع ذلك ، يمكنك الوصول إلى الخصائص والطرق الساكنة من خلال طريقة غير قابلة للاتصال (مع self::)

ملكيات

هل يتم تعيين قيمة خاصية معينة إلى مخطط الفئة أو بالأحرى مثيله (تم إنشاؤه كائن من فئة)؟ إذا لم تكن القيمة ضيقة على مثيل الفئة (كائن الفئة) ثم يمكنك إعلان ذلك على أنه خاصية ثابتة.

private static $objectCreatedCount; // this property is assign to class blueprint
private $objectId; // this property is assign explicitly to class instance

أساليب

عند اتخاذ قرار بشأن جعل طريقة ثابتة أو غير قاسية ، تحتاج إلى أن تسأل نفسك سؤالًا بسيطًا. هل تحتاج هذه الطريقة إلى استخدامها $this؟ إذا كان كذلك ، إذن لا ينبغي إعلانه على أنه ثابت.

ولأنك لا تحتاج إلى $ لا تعني هذه الكلمة الرئيسية تلقائيًا أنه يجب عليك صنع شيء ثابت (على الرغم من أن العكس صحيح: إذا كنت بحاجة إلى $ ، اجعلها غير منتظمة).

هل تتصل بهذه الطريقة على كائن فردي أو على الفصل بشكل عام؟ إذا لم تكن متأكدًا من الشخص الذي يجب استخدامه لأن كلاهما مناسب لحالة الاستخدام المعينة ، فاستخدم دائمًا غير منتظم. سوف يمنحك المزيد من المرونة في المستقبل.

الممارسة الجيدة هي البدء دائمًا في تصميم صفك باعتباره ثابتًا وقوة ثابتة إذا أصبحت حالة الولايات المتحدة واضحة للغاية.

يمكنك محاولة إعلان المعلمات الخاصة بك على أنها ثابتة ... فقط حتى تتمكن من الوصول إليها من طريقة ثابتة ، ولكن هذا عادة لا يكون ما تريد القيام به. لذلك إذا كنت بحاجة حقًا إلى الوصول $this من الطريقة الثابتة ، فهذا يعني أنك تحتاج إلى إعادة التفكير/إعادة تصميم بنية الفصل لأنك لا تخطئ.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top