هل تحتاج إلى تحميل __Get لإدارة جميع متغيرات الأعضاء؟

StackOverflow https://stackoverflow.com/questions/896323

سؤال

أقوم بإنشاء وظيفة __GET () لفئة للتحكم في الوصول إلى متغيرات العضو الخاص. هل أحتاج إلى تصميم الوظيفة للتعامل مع كل قيمة العضو الممكنة قراءة أو لا أستطيع كتابتها للأعضاء الجمهور؟ أيضا، أفترض أن الفئات التي ترث هذه الفئة ستستخدم وظيفة __et () الخاصة بي للوصول إلى أعضاء خاصين.

class ClassA{
  private $collection = array();
  public $value;

  function __get($item){
    return $collection[$item];
  }
هل كانت مفيدة؟

المحلول

لا، أنت لا تفعل ذلك.


class A {
   public $foo = 'bar';
   private $private = array();

   public function __get($key) {
      echo 'Called __get() at line #' ,__LINE__, ' with key {', $key ,'}',"\n";
      return $this->private[$key];
   }

   public function __set($key, $val) {
      $this->private[$key] = $val;
   }
}


$a = new A();

var_dump($a->foo);
$a->bar = 'baz';
var_dump($a->bar);

ونعم، سوف:


class B extends A { private $private = array(); }
$b = new B();
var_dump($b->bar);

نصائح أخرى

حسنا، سوف يفشل الكود الخاص بك على عناصر خاصة لم يتم تعيينها في صفيفك. ولكن بعد ذلك مرة أخرى، يمكنك استخدام هذا كوسيلة للتعامل مع ما هو داخل ومجموعك، على هذا النحو؛

  function __get($item){
    if ( isset ( $collection[$item] ) )
       return $collection[$item];
    else {
       try {
          return $this->$item ;  // Dynamically try public values
       } catch (Exception $e) {
          $collection[$item] = 0 ; // Make it exist
       }
    }
  }

سوف تستخدم الدروس التي ترث مكالماتك هذه __Get ()، ولكن يمكن تجاوزها، لذلك استخدم الوالد :: __ بناء () لسهولة العرض. لاحظ أيضا أن هذه لا يمكن أن تكون ثابتة. قراءة متعمقة.

أولا وقبل كل شيء عمليات البحث PHP عن اسم العقار في تعريف الطبقة وحاول إرجاع قيمتها. إذا لم يكن هناك عقار - يحاول PHP الاتصال __Get ($ var) وهنا يمكنك إعادة أي شيء تريده. هذا هو السلوك المربك قليلا بالنسبة لأولئك الذين يعرفون Java Getters / setters حيث يتعين عليك تحديدها مقابل كل عضو من الدرجة التي تريد الوصول إليها.

عندما يكون الأمر مرتاحا لاستخدام Java-Like Getters / Setters - يمكنك كتابة شيء مثل هذا:

public function __set($var, $value)
{
    if (method_exists($this, $method = "_set_" . $var))
    {
        call_user_func(array($this, $method), $value);
    }
}
public function __get($var)
{
    if (method_exists($this, $method = "_get_" . $var))
    {
        return call_user_func(array($this, $method), $value);
    }
}

ثم استخدم هذا الرمز عن طريق تحديد Getters / setters مخصص

protected function _get_myValue() 
     {
         return $this->_myValue; 
     }
protected function _set_myValue($value)
{
    $this->_myValue = $value;
}

والوصول إلى الأساليب المحددة بهذه الطريقة:

$obj->myValue = 'Hello world!';
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top