Tefrika dizide saklanan Yardım yükleme contstants eval () kullanarak ve sürekli ()

2 Cevap php

DISCLAIMER: Please read carefully as this is NOT a question about storing arrays in constants or simple eval() or serialize() techniques. This IS a question primarily about how constants work in PHP and why the constant() function is not working to convert a constant name into a constant value. Thanks.

BACKGROUND: For various reasons, I started out with a flat config file for a homebrewed LAMP(PHP) CMS (in private development). Looking back this may have been misguided, and I have transitioned my variable storage into a DB table. However, the bulk of the code still depends on the CONSTs, so I use eval("define(A, B...);") to load the DB values A and B into constants. This part works fine. But it gets a bit more complicated.

PROBLEM: The problem I'm having now is with constants in arrays (NB. NOT arrays in constants). I have a big, GLOBAL array called defaults that contains config settings in the format shown below.

Başlangıçta, ben beyan: <?php define('THIS_IS_A_CONSTANT', 'abcdefg'); ?> (Ve BU İŞLERİ ...)

Sonra, ben şu iç içe dizi olarak $ GLOBALS ['varsayılan'] tanımlamak:

Array 
(
   'var_name' => Array 
        (
            'display' => THIS_IS_A_CONSTANT,
            'value'   => 12,
            'type'    => 'int',
            'params'  => Array ( ... )
        ),

    ...
    Lots more variables...
    ...

)

Bu dizi yapısını emme dan (CMS idari arkaplanı üzerinden dosya sistemi erişimi ancak doğrudan DB erişimi vardır ama çoğu sabitleri dahil olmak üzere bazı değerleri değiştirebilirsiniz) istemci önlemek için, ben dizi yapıyı serialize ve DB bu dizesini depolamak . Her sayfa isteği üzerine, ben ilk o zaman ben (tefrika ve DB saklanan olduğu) Yukarıdaki dizi unserialize, ((define A, B. ..)) eval kullanarak (DB saklanan) tüm sabitleri tanımlar. Ancak, ne olursa olsun ben denemek ne $GLOBALS['defaults']['var_name']['display'] sabitler içeren values olarak kabul edilmesi de değerleri alınamıyor. Bunun yerine, sürekli adını gösterir ve DEĞİL sabit değeri (diğer bir deyişle, benim çıkış THIS_IS_A_CONSTANT yerine içerir 'abcdefg'). Çok sinir bozucu, değil mi?

Ben ($ dizi Ben DB getirme dizgilenmemiş dizi içeren) aşağıdaki gibi bir şey denedim:

    foreach ($arr as $item => $contents) {
            $display = isset($contents['display']) ? $contents['display'] : 1;
            $value = constant("$display");

            // This doesn't work, though it seems like it should            
            $contents['display'] = $value;
            // Neither does this, no matter how much I juggle the quotation marks and backslashes
            eval("\$contents['display'] = constant(\"$value\");");
            // or this ...
            eval("\$contents['display'] = $value;");
            // or this ...
            eval("\$contents['display'] = \$value;");
            // or a number of other things...

    }
    $GLOBALS['defaults'] = $arr;

QUESTIONS: Has anyone dealt with this kind of situation before? Can anyone advise me how to force my constants to be recognized as CONSTANTS and not strings. Do I need to serialize my array differently? Or maybe process the unserialized array differently (after retrieving it from the DB)? Is these some combination of eval() and constant() that will allow me to do this? Why are the constants within my array behaving badly while the constants I define normally are working without problem? Any help at all would be greatly appreciated, as I've been puzzling over this for a few days now and haven't come to any solutions.

Dakota, tüm iyi.

2 Cevap

Eval kullanımları var olsa da, bu durumlarda biri değil. Sen zamanında eval teslim ediliyor ne hiçbir fikrim yok - ve sonra bir kullanıcı veri depolama yerde kod olarak tedavi edilir bir şey saklamak şeylerin sesleri.

Dizi ilan edilmeden önce tanımlanmış sabit ise o zaman tefrika sürümü yerine etiketin değerini içerecektir. Ben sadece değeri çalışma zamanında bağlamında bağlı olarak farklı olabileceğini varsayabiliriz.

Ben daha iyi bir çözüm, örneğin, PHP kendi makro dili roll olacağını öneririm gibi bir şey:

<?php
global $defs;

$defs=array(
  'THIS_IS_A_CONSTANT' => 'abcdefg',
  'SO_IS_THIS' => 23
);

// for inline constants  
foreach ($defs as $label =>$val) {
  define($label, $key);
}
replacer($defs,true);

function replacer($in, $init=false;)
{
   static $defs;
   static $vals;
   if ($init) {
      $defs=array_keys($in); 
      $vals=array_values($in);
      return count($in);
   }
   return str_replace($defs, $vals, $in);
  // you might want to use preg_replace() with a pattern based on $defs for a neater solution
}

function fix_var(&$in) 
{
   if (is_array($in)) {
      foreach ($in as $key=>$dummy) {
        fix_var($in[$key]);
      }
   } else {
      $in=replacer($in);
   }
}

>

C.

Öncelikle, neden evaling vardır? Ne diyorsun itibaren $GLOBALS['defaults']['var_name']['display'] sabiti THIS_IS_A_CONSTANT değeri olması değerini istiyorum. Eğer veritabanından dize de-tefrika ve $GLOBALS['defaults'] in itti ve dize sabit ismi değil sabitinin değeri olarak değerini kaydettikten.

Eğer denedim:

<?php 
define('THIS_IS_A_CONSTANT', 'abcdefg');
$value = constant($GLOBALS['defaults']['var_name']['display']);
//$value should now be abcdefg not THIS_IS_A_CONSTANT
$GLOBALS['defaults']['var_name']['display'] = $value;
?>

"$ GLOBALS ['varsayılan'] ['var_name'] ['display']" dizesini içeren yoksa THIS_IS_A_CONSTANT daha sonra yapmanız gereken, tüm sabit funct bu dizeyi geçmektedir.

Ben bir şey eksik?