تحليل الطبقات والوظائف الحجج في PHP
-
06-07-2019 - |
سؤال
أريد إنشاء وظيفة الذي يتلقى حجة واحدة أن يحمل المسار إلى ملف 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();
}
}
نصائح أخرى
أقترح الإجراء التالي:
- مخزن الانتاج الحالي من
get_declared_classes
,get_declared_interfaces
وget_defined_functions
(إذا كنت حقا بحاجة إلى الدعم لهم) - تشمل الملف
- قارن
get_declared_classes
,get_declared_interfaces
و زet_defined_functions
مع تلك المخزنة لمعرفة ما هو جديد - استخدام التفكير لتحليل لهم
- انتقل إلى الخطوة 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: هناك شيء واحد ليس لدي أي فكرة عنه هو: "<م> كيفية العثور على أي الطبقات / أساليب تم تعريفها في ملف معين م>": - (
وإذا كان أي شخص لديه فكرة، فإنه سوف يكون موضع ترحيب!