سؤال

أريد إنشاء وظيفة الذي يتلقى حجة واحدة أن يحمل المسار إلى ملف PHP ومن ثم يوزع ملف معين و ترجع شيء من هذا القبيل:

class NameOfTheClass
   function Method1($arg1, $arg2, $arg2)
   private function Method2($arg1, $arg2, $arg2)
   public function Method2($arg1, $arg2, $arg2)

abstract class AnotherClass
   function Method1($arg1, $arg2, $arg2)
   private function Method2($arg1, $arg2, $arg2)
   public function Method2($arg1, $arg2, $arg2)

function SomeFunction($arg1, $arg2, $arg3)

هذه الوظيفة يجب إرجاع كافة الفئات وأساليب وظيفة موجودة في ملف معين مع كل تعريف معرفات (مجردة ، القطاعين العام والخاص, محمية, ثابت, يمتد, واجهات, ...).

أول ريك استخدام التعبيرات العادية للقيام بذلك ، ولكن هذه التصرف سيئة جدا مع التعليقات ، أي:/* ترجع هذه الدالة(ماكس(راتب)) */ و تصبح معقدة جدا إذا كنت تريد أن تدعم بشكل صحيح نطاقات.

حل آخر ممكن لاستخدام التالية المدمج في وظائف PHP:

get_declared_classes
get_declared_interfaces
get_defined_functions
get_class_methods

إلا أن هذه الوظائف لا تسمح لي أن أرى الملف حيث فئات / طرق / وظائف محددة وبالتالي فإنه ليس من المفيد جدا.

وأعتقد أن Tokenizer التمديد هو حل مشكلتي ، ومع ذلك لم تستخدم هذه الإضافة من قبل.

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

المحلول

إذا كنت تستخدم PHP 5، و انعكاس API هو اداة الخاص بك.

مثال:

$class = new ReflectionClass("NameOfTheClass");
$methods = $class->getMethods();
foreach($methods as $m) {
    print $m->name;
    $m->isPrivate() ? print "Private" : print "";
    $m->isPublic() ? print "Public" : print "";
    $params = $m->getParameters();
    foreach($params as $p) {
        print $p->getName();
        }
}

نصائح أخرى

أقترح الإجراء التالي:

  1. مخزن الانتاج الحالي من get_declared_classes, get_declared_interfaces و get_defined_functions(إذا كنت حقا بحاجة إلى الدعم لهم)
  2. تشمل الملف
  3. قارن get_declared_classes, get_declared_interfaces و زet_defined_functions مع تلك المخزنة لمعرفة ما هو جديد
  4. استخدام التفكير لتحليل لهم
  5. انتقل إلى الخطوة 2 على الملف التالي

ومثلك وجدت بنفسك، باستخدام التعابير المنطقية لا بأس به وليس الأداة المناسبة لهذا المنصب، وهنا ^^

و، كما قلت لك، وظائف مدمج لك المقترحة التي ليست مفيدة سواء - الشيء الوحيد الذي يمكن أن تكون مفيدة لأنها تسمح لك أن تعرف ما هي وجود الطبقة ... لكنها سوف تعود فصول مدمج جدا : - (

وعن طريق تمديد Tokenizer يبدو قليلا مبالغة / من الصعب بالنسبة لي. ربما لن يذهب بهذه الطريقة، في الواقع: جدا "على مستوى منخفض"، وأفترض

.

و
بدلا من ذلك، أود أن نلقي نظرة على انعكاس API : كان موجودا بالضبط ل عكس مهندس الطبقات، واجهات، وظائف، ...

وهكذا، ولكنني اعتقد انها ستكون مناسبة تماما تماما عن ما تحاول القيام به.

و
تحرير: هنا هو مثال سريع:

أولا، دعونا نحاول أن نفعل انعكاس على فئة:

include dirname(__FILE__) . '/temp-2.php';
$rC = new ReflectionClass('MyFirstClass');

ويمكنك الآن معرفة في الملف الذي أعلن فيه، والأساليب التي هي فيه:

var_dump($rC->getFileName());
var_dump($rC->getMethods());

والتي سوف تحصل على:

string '/home/squale/developpement/tests/temp/temp-2.php' (length=48)

array
  0 => &
    object(ReflectionMethod)[2]
      public 'name' => string '__construct' (length=11)
      public 'class' => string 'MyFirstClass' (length=12)
  1 => &
    object(ReflectionMethod)[3]
      public 'name' => string 'glop' (length=4)
      public 'class' => string 'MyFirstClass' (length=12)

و
والآن، للحصول على المعلومات حول كل طريقة:

foreach ($rC->getMethods() as $rM) {
    var_dump($rM, $rM->getParameters());
    echo '-----';
}

وستحصل على:

object(ReflectionMethod)[3]
  public 'name' => string '__construct' (length=11)
  public 'class' => string 'MyFirstClass' (length=12)

array
  0 => &
    object(ReflectionParameter)[4]
      public 'name' => string 'arg1' (length=4)
  1 => &
    object(ReflectionParameter)[5]
      public 'name' => string 'arg2' (length=4)

-----

object(ReflectionMethod)[2]
  public 'name' => string 'glop' (length=4)
  public 'class' => string 'MyFirstClass' (length=12)

array
  0 => &
    object(ReflectionParameter)[5]
      public 'name' => string 'a' (length=1)

و
من هناك، يجب أن تكون قادرة على حفر أكثر قليلا. والوصول الى ما سألت أولا؛ -)

و
ونتيجة لsidenote: هناك شيء واحد ليس لدي أي فكرة عنه هو: "<م> كيفية العثور على أي الطبقات / أساليب تم تعريفها في ملف معين ": - (

وإذا كان أي شخص لديه فكرة، فإنه سوف يكون موضع ترحيب!

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