هل من الممكن تعديل طرق مثيل الكائن باستخدام الانعكاس

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

سؤال

ما أحاول القيام به هو إنشاء نموذج مجال مع كائن PHP قديم عادي. أنا أقوم بإنشاء مكتبة ستقوم بجميع أشياء البنية التحتية. لذلك يبدو أن أحد طرازي مثل هذا

class Project {
  public $id;
  public $name;
  public $typeId;

  private $type;

  public function getType() {
    return $this->type;
  }

  public function setType(Type $type) {
    $this->typeId = $type->id;
    $this->type = $type;
  }
}

الآن إذا أنشئ مشروعًا جديدًا ومكالمة setType مع كائن نوع صالح وحفظ مثيل المشروع باستخدام ORM يتم حفظ كل من المشروع والنوع. ولكن بعد ذلك أقوم بتحميل المشروع وأستخدمه getType الطريقة التي أريد أن يقوم ORM بتعديل هذه الطريقة بشفافية لتحميل الكائن من الدفن. لذلك هذه الطريقة هنا:

public function getType() {
  return $this->type;
}

لتغيير الشفافية إلى:

public function getType() {
  if (is_null($this->type) {
    $this->type = $this->adapter->findById('table', $this->typeId);
  }

  return $this->type; // or return parent::getType();
}

يستخدم Outlet PHP Eval لإنشاء فئة وكيل للمشروع يسمى Project_proxy ، ولكن في بعض الأحيان ستكون هناك فئات فرعية من المشروع ، لذلك أنا أبحث عن حل باستخدام API الانعكاس إذا كان هناك طريقة.

لقد بحثت في Google لكن لم أجد على أي حال لتغيير سلوك الطريقة

تعديل: أم أنه سيكون من الجيد استخدام طريقة Eval الخاصة بـ Outlet PHP لإنشاء فصول وكيل لنماذج بلدي وجميع الفئات الفرعية منها؟

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

المحلول

لا توجد طريقة مبنية على القيام بذلك. وعلى الرغم من أنه يمكنك القيام بذلك باستخدام امتداد PECL يسمى RunKit, ، أوصي بشدة العثور على حل آخر. تغيير تنفيذ الوظائف التي لا يمكنك معرفتها اى شى حوله أمر خطير للغاية وقد يؤدي إلى الأخطاء حيث يمكن أن يستغرق تصحيح أخطاء من هذا القبيل وقتًا أطول من كتابة if (is_null(... بيانات ل الكل وظائفك.

راجع للشغل: لا تستخدم is_null(), ، نظرًا لأنك قد تجلب القيم الفارغة من قاعدة البيانات مرارًا وتكرارًا. يجب عليك تخزين القيم التي تم جلبها في متغير منفصل.

نصائح أخرى

النظر في الانعكاس مستند على php.net ، يبدو لي أنه من المستحيل تعديل طريقة في الرحلة.

يجب أن تحاول القيام بذلك بطريقة مختلفة.

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