Ayrıştırma Sınıflar, Fonksiyonlar ve PHP Argümanlar

4 Cevap php

Ben bir PHP dosyası yolunu tutan ve daha sonra verilen dosyayı ayrıştırmak ve böyle bir şey döndüren tek bir argüman alır bir işlev oluşturmak istiyorsanız:

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)

Bu fonksiyon tüm tanımlanan tanımlayıcılar (soyut, kamu, özel, korumalı, statik, uzanır arayüzler, ...) ile verilen dosyada bulunan tüm sınıfları, yöntemleri ve işlevi dönmelidir.

Benim ilk öğretilmesi ancak bu yorumlarla oldukça kötü davrandığını, bunu yapmak için normal ifadeler kullanmak oldu, yani: / * Bu fonksiyon döndürür (max (maaş)) * / ve düzgün kapsamları desteklemek istiyorsanız, oldukça karmaşık hale gelir.

Bir diğer olası çözüm aşağıdaki yerleşik PHP fonksiyonlarını kullanmak oldu:

get_declared_classes
get_declared_interfaces
get_defined_functions
get_class_methods

Ancak bu fonksiyonlar bana sınıfları / yöntem / fonksiyonları tanımlanmış ve böylece çok kullanışlı değil olduğunuz dosyayı görmek için izin vermez.

Ancak ben daha önce bu uzantıyı hiç kullanmamış ve birileri bazı tavsiyeler vermek ve temel bir uygulama örneği ile bana yardımcı olabilir umuyordum, Simgeleştirici uzatma benim sorun için çözüm olduğuna inanıyoruz.

4 Cevap

Eğer PHP 5 kullanıyorsanız, Reflection API için bir araçtır.

Örnek:

$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();
        }
}

Kendinizi öğrendim gibi, regex ^ ^ burada, iş için doğru araç oldukça değildir

Eğer dediğin gibi, size önerilen yerleşik fonksiyonlar ya bu yararlı değil - faydalı olabilir tek şey, onlar var, hangi sınıf bilmek izin olduğunu ... Ama onlar :-( çok yerleşik sınıfları dönersiniz

Simgeleştirici uzantısını kullanarak bana biraz overkill / zor görünüyor; Ben muhtemelen aslında, bu şekilde gitmek olmaz: çok "düşük seviyeli", sanırım.


Instead, I would take a look at PHP's Reflection API : it exists exactly to reverse-engineer classes, interfaces, functions, ...

Yani, oldukça yapmak için çalışıyoruz ne için uygundur olurdu herhalde.


Edit : here is a quick example :

İlk olarak, bir sınıf üzerinde yansıma yapmak deneyelim:

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

Sen şimdi ilan edildiği dosyası bulmak ve hangi yöntemleri içinde vardır olabilir:

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

Seni alacak olan:

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)


And now, to get informations on each method :

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

Alırsınız:

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)


From there, you should be able to dig a bit more ; and arrive to what you first asked ;-)


As a sidenote : there is one thing I have no idea about is : "how to find which classes / methods are declared in a given file" :-(

Herkesin bir fikri varsa, bu hoş olacak!

Ben de dizgeciklerini hiç kullanmadım gibi, belirli soru ile size yardımcı olamaz.

Sizin için bu kullanarak konum ne söz yok, ama PHPDoc gibi bir şey ihtiyacınız ne yapardınız?

Ben aşağıdaki yordamı öneririz:

  1. get_declared_classes akım çıkışını saklamak, get_declared_interfaces ve get_defined_functions (Eğer gerçekten onları desteklemek için gerekirse)
  2. dosyasını dahil
  3. karşılaştırmak get_declared_classes, get_declared_interfaces ve g et_defined_functions yeni ne görmek için saklı olanlarla
  4. bunları analiz etmek yansıma kullanın
  5. sonraki dosyaya goto adım 2