Bir PHP komut her yer dosyayı çözmek ve kodlamalısınız herhangi bir araç var mı?

2 Cevap php

Ben eğer varsa, bir aracı gerekir veya altında 5 dakika yazabilirsiniz if (kimsenin zaman harcamak istemiyorum).

Söz konusu araç, bir PHP komut dosyası içeren gerektirir, include_onceyi ve require_oncenin çözmek ve aslında özyinelemeli, daha sonra içeriğini harcode olacaktır.

Bu aslında birden fazla dosya dahil kod ve kaynaklarını kullanmak büyük bir dosyada PHP betikleri gemi için gerekli olacaktır.

I know PHP CLI komut için en iyi araç değildir, ama ben ona en yanlısı verimli olduğum gibi, ben bazı kişisel ya da yarı-kişisel araçları yazmak için kullanmak. I don't want un-helpful answers or comments that tell me to use something else than PHP or learn something else.

Bu yaklaşımın fikri benim kişisel ~/.bin/ dizine koyun ve tamamen fonksiyonel ve kendine yeten script olarak orada yaşamasına izin için gereken her şeyi temsil edecek tek bir dosya var edebilmek olmaktır. Ben XDG veri dizinleri standartları ya da başka bir şey onur şey komut yolları dahil ayarlayabilirsiniz biliyorum, ama ben bu yaklaşımı denemek istedim.

Neyse ben tekerleği yeniden icat etmek istemiyorum ve tüm aramalar şey verdi, çünkü ben orada sormak, ama burada herhangi bir fikir yoksa, ben gidiyordu şekilde devam ve aslında bir aracı yazacağım Bu içerir ve gerektirir çözecektir.

Herhangi bir yardım için teşekkür ederiz!

P.S.: I forgot to include examples and don't want to rephrase the message: Those two files
mainfile.php

<?php
    include('resource.php');
    include_once('resource.php');
    echo returnBeef();
?>

resource.php

<?php
    function returnBeef() {
        return "The beef!";
    }
?>

Gibi "derlenmiş" olacaktır (yorum netlik eklenmiş)

<?php

    /* begin of include('resource.php'); */?><?php
    function returnBeef() {
        return "The beef!";
    }
    ?><?php /* end of include('resource.php); */
    /*
    NOT INCLUDED BECAUSE resource.php WAS PREVIOUSLY INCLUDED 
    include_once('resource.php'); 
    */
    echo returnBeef();
?>

Komut çıktısı açık yorumlarına zorunda değildir, ama yaptım eğer güzel olabilir.

Tekrar teşekkürler herhangi bir yardım için!

EDIT 1

Ben komut dosyası için basit bir değişiklik yaptı. Ben aracını kendim yazmaya başlamıştı gibi, ben orijinal senaryoda yapılan bir hata gördük. Dahil dosyası (<?php ?>) başlangıç ​​ve bitiş etiketlerinin dışında kapalı olan işin en az miktarda yapmak için, olurdu

Elde edilen komut Örnek sonucu olarak tadil edilmiş olan, ancak test edilmemiştir.

EDIT 2

Betik aslında çalışma zamanı doğru ayrıştırma gibi PHP script ağır ayrıştırma yapmak gerekmez. Basit gibi sadece ('dosya.php') ;) içerir (tedavi edilmesi gerekir içerir.

Ben senaryo üzerinde çalışıyor ve inintelligemment sadece <?php ?> etiketleri değil, yorumlarda ne dizeleri eklemek onları ayrıştırmak için dosyayı okuyorum başladı. Küçük bir amaç da içeren yönergede dirname(__FILE__)."" algılamak ve gerçekten onur muktedir olmaktır.

2 Cevap

Ilginç bir sorun, ama detaylı çalışma zamanı bilgisi olmadan gerçekten çözülebilir değil bir. Şartlı içerir belirlemek neredeyse imkansız olurdu, ama yeterince basit varsayımlar, yaparsanız belki böyle bir şey yeterli olacaktır:

<?php
  # import.php 
  #
  # Usage:
  # php import.php basefile.php
  if (!isset($argv[1])) die("Invalid usage.\n");

  $included_files = array();

  echo import_file($argv[1])."\n";

  function import_file($filename)
  {
    global $included_files;

    # this could fail because the file doesn't exist, or
    # if the include path contains a run time variable
    # like include($foo);
    $file = @file_get_contents($filename);
    if ($file === false) die("Error: Unable to open $filename\n");

    # trimming whitespace so that the str_replace() at the end of 
    # this routine works. however, this could cause minor problems if
    # the whitespace is considered significant
    $file = trim($file);

    # look for require/include statements. Note that this looks
    # everywhere, including non-PHP portions and comments!
    if (!preg_match_all('!((require|include)(_once)?)\\s*\\(?\\s*(\'|")(.+)\\4\\s*\\)?\\s*;!U', $file, $matches, PREG_SET_ORDER |  PREG_OFFSET_CAPTURE ))
    {
      # nothing found, so return file contents as-is
      return $file;
    }

    $new_file = "";
    $i = 0;
    foreach ($matches as $match)
    {
      # append the plain PHP code up to the include statement 
      $new_file .= substr($file, $i, $match[0][1] - $i);

      # make sure to honor "include once" files
      if ($match[3][0] != "_once" || !isset($included_files[$match[5][0]]))
      {
         # include this file
         $included_files[$match[5][0]] = true;
         $new_file .= ' ?>'.import_file($match[5][0]).'<?php ';
      }

      # update the index pointer to where the next plain chunk starts
      $i = $match[0][1] + strlen($match[0][0]);
    }

    # append the remainder of the source PHP code
    $new_file .= substr($file, $i);

    return str_replace('?><?php', '', $new_file);
  }
?>

Etrafında çalışmış olabilir bazıları yukarıdaki kodu gereken birçok nokta vardır. (Başkası için bir egzersiz olarak bırakıyorum.) Birkaç isim için:

  • Bu <?php ?> blokları onur vermez, bu nedenle HTML içinde maç olacak
  • Bu herhangi bir PHP kuralları hakkında bilmiyor, bu yüzden PHP yorumların içinde maç olacak
  • Bu değişken (örneğin, include $foo;) içerir işleyemez
  • Bu kapsam hataları tanıtmak olabilir. (Örneğin, if (true) include('foo.php'); olmalıdır if (true) { include('foo.php'); }
  • Sonsuz özyinelemeli içerir için kontrol etmez
  • Bu yolları dahil bilmiyor
  • vs ..

Ama böyle bir ilkel devlet, hala yararlı olabilir.

Siz işlevi yerleşik get_included_files, bunu tahmin, tüm dahil dosyaların bir dizi döndüren kullanabilirsiniz.

İşte bir örnek, sen mainfile.php sonunda bu kodu açılır ve sonra mainfile.php kaçardım.

  $includes = get_included_files();

  $all = "";
  foreach($includes as $filename) {
    $all .= file_get_contents($filename);
  }
  file_put_contents('all.php',$all);

Unutulmaması gereken bir kaç şey:

  • Herhangi bir final dosyasının içine dökülüyor olmayacak (bir bir işlev içinde dahil yani) aslında işlenmiş olmadığı içerir. Sadece aslında çalıştırmak hangi içerir.
  • Bu aynı zamanda her dosyanın etrafında olacak ama tek bir metin dosyası içindeki hiçbir sorunları ile bu gibi birden fazla blok olabilir.
  • Bu dahil başka dahil her şeyi içerir OLACAKTIR.
  • Evet, get_included_files komut gerçekten de çalışan listeler.

Bu yerine bir düşüş tek başına bir araç olarak HAD eğer, sen de açmasının dosyayı okumak metin olarak bu kod ekleyebilirsiniz, daha sonra (muhtemelen tehlikeli) tüm şey eval.