PHP makro / inline fonksiyonlar (kapsam dışına gitmek değişkenler önlemek için)

4 Cevap

Ben şu ikilem var. Ben karmaşık bir CMS var ve bu CMS bir grafik tasarımcı tarafından temalı olmaktır. Şablonları Çeşitli iç içe kapanım ile, düz HTML vardır. Ben sayfanın HTML bakarak, daha kolay tasarımcı değiştirilecek dosyayı bulmak için yapmak istiyorum.

Ne ben ilk etapta düşünülen bu gibi aptalca bir şey inşa etmek oldu:

function customInclude($what) { 
  print("<!-- Including $what -->");
  include($what);
  print("<!-- End of $what -->");
}

ama, ne oldu? Ben küresel ya da parametre olarak ilan edemez :-) değişkenler açıkçası ben onlar denir nasıl ve ne kadar çok var yok gibi, dahil dosyanın kapsam çıkıyor.

PHP "makro genişleme" çeşit uygulamak için herhangi bir olasılık var mı? Onu aramak için alternatif bir yol: Ben bir boy odaklı tarzı Değiştir fonksiyonu her çağrı, değiştirmek istiyorum.

I) eval (düşündünüz mü, bu tek yoldur? Performans üzerinde büyük bir etkisi var mı?

4 Cevap

Emin değilim tamamen soruyu anlıyorum, ama sadece onlara dahil dosyanın yatan dosya göstererek tasarımcı için hayatı kolaylaştırmak için çalışıyorsanız, o zaman muhtemelen sadece şablon dosyaları içinde kullanabilirsiniz eğer:

echo '<!-- Start of '.__FILE__.' -->';
....content... 
echo '<!-- End of '.__FILE__.' -->';

__FILE__ sadece bir tanesi olan Magic Constants.

Ayrıca kullanım olabilir tüm dosyaların dahil bir dizi, (çıktı örneğin kendi adına 'VUK' ile tüm içerdiği dosyaların bir listesini olabilir) döndürür get_included_files() işlevi var.

Bu özel sorun eklemek için benim% 100 harcoded çözümdür. Bu sonraki dosya adını içerir gelin ve sonra benim özel proxy-include-dosyayı eklemek için küresel bir var kullanarak ilgili (wich özel vekil-include-fonksiyonunu yerine)

1 - (senin customInclude fonksiyonu tanımlanır yerde) arasında dünya için bu kodu ekleyin

    $GLOBALS['next_include'] = "";
    $GLOBALS['next_include_is_once'] = false;
    function next_include($include_file) {
        $GLOBALS['next_include_is_once'] = false;
        $GLOBALS['next_include'] = $include_file;
    }

    function next_include_once($include_file) {
        $GLOBALS['next_include_is_once'] = true;
        $GLOBALS['next_include'] = $include_file;
    }

2 - Bazı örnek, "debug_include.php" vekil-include-içerme dosyası oluşturun

    <?php
    if(empty($GLOBALS['next_include'])) die("Includes Problem");

    // Pre-include code
    // ....

    if($GLOBALS['next_include_is_once']) {
        include_once($GLOBALS['next_include']); 
    } else {
        include($GLOBALS['next_include']);
    }

    // Post-include code
    // ....

    $GLOBALS['next_include'] = "";

3 - Perform a search and replace in all your files: (except debug_include.php)
search: 'include((.*));' as a reg.exp
replace with: '{next_include($1);include('debug_include.php');}'
and
search: 'include_once((.*)); as a reg.exp
replace with: '{next_include_once($1);include('debug_include.php');}'

Maybe you should need another search-and-replaces if you have some non-standard includes like

    include (....     include  (....       include   (.... 


I think you can find some better search-and-replace patterns, but I'm not a regular expression user so I did it the hard way.

Bu eski bir soru olduğunu biliyorum ama ben onun üzerine tökezledi ve ben de bunu yapmak için kullanılan bir şey hatırlatıyor.

nasıl bir çok garip bir değişken kullanarak işlevi oluşturursanız hakkında?

<?php
function customInclude($___what___) { 
  echo '<!-- Including '.$___what___.' -->';
  include($what);
  echo '<!-- End of '.$___what___.' -->';
}
?>

Ben genellikle sadece gerektiğinde, diğer insanlar bilmek istemiyorum bu etiketleri görüntülemek için olası bir değişken eklemek için öneririm ...

<?php
function __printIncludeInfo($info, $dump = false){
   //print only if the URL contains the parameter ?pii
   //You can modify it to print only if coming from a certain IP
   if(isset($_GET['pii'])){
       if($dump){
          var_dump($info);
       } else {
          echo $info;
       }
   }
}
function customInclude($___what___) { 
  __printIncludeInfo('<!-- Including '.$___what___.' -->');
  include($what);
  __printIncludeInfo('<!-- End of '.$___what___.' -->');
}
?>

Bu şekilde size gereken herhangi bir diğer bilgileri yazdırmak için işlevini kullanabilirsiniz

Kesinlikle nesneler, ad ve MVC modelini kullanmak gerekir. Aksi no pure and clean solution sorununuza var. Ve, o kötülük, eval kullanmayın lütfen.