2010-01-11 6 views
0

J'ai un, je pense assez facile, la question, mais je ne peux pas comprendre ce que je fais mal. J'ai une fonction que j'appelle avec la fonction de PHP eval. Je m'attends à ce qu'un ArrayList soit auto-construit. Mais quand j'utilise gettype, je vois que le résultat est NULL. Même si j'utilise return dans la fonction eval-ed.PHP eval retourne null, mais un retour est appelé

Pour autant que je sache que je joue par la documentation, mais de toute façon il ne fonctionne pas. Aucune suggestion?

fragment de code

<?php 
       $widgetList = new ArrayList(); 

       for($i = 0; $i < $selectedTemplate->Regions->count(); $i++) 
       { 
        $region = $selectedTemplate->Regions->item($i); 

        if($region->Widget->selectiveContent == 1) 
        { 
         $widgetList->add($region->Widget); 
        } 
       } 

       if($widgetList->count() > 0) 
       { 
      ?> 
      <tr> 
       <td colspan="2"> 
        <strong>Widget instellingen</strong> 
        <hr size="1" width="100%" color="#333"/> 
       </td> 
      </tr> 
      <?php 
        for($i = 0; $i < $widgetList->count(); $i++) 
        { 
      ?> 
      <tr> 
       <td class="w150"> 
        <?= $widgetList->item($i)->title ?> 
       </td> 
       <td> 
        <select name="widget_<?= $widgetList->item($i)->id ?>" class="full"> 
        <?php 
         $itemList = eval($widgetList->item($i)->functionCall); 
         for($j = 0; $j < $itemList->count(); $j++) 
         { 
          $selected = null; 
          if($_POST["widget_".$widgetList->item($i)->id] == $itemList->item($j)->id) 
          { 
           $selected = " selected=\"selected\""; 
          } 
        ?> 
         <option value="<?= $itemList->item($j)->id ?>"<?= $selected ?>><?= $itemList->item($j)->title ?></option> 
        <?php 
         } 
        ?> 
        </select> 
       </td> 
      </tr> 
      <?php 
        } 
       } 
      ?> 

Code Eval-ed

public function getNavigationByLanguageId(Integer $parent, ArrayList $objectList, Integer $language) 
    { 
     $query = DataAccess::getAdapter()->query(" 
        SELECT  * 
        FROM  `navigation` 
        WHERE  `parent_id`  = ".$parent->value." 
        AND   `language_id` = ".$language->value." 
        AND   `website_id` = ". $_SESSION["currentSite"]["id"]." 
        ORDER BY `sort_order`"); 

     while($result = DataAccess::getAdapter()->fetchAssoc($query)) 
     { 
      $link = new Model_Navigation(); 

      $link->id   = $result["id"]; 
      $link->language  = $result["language_id"]; 
      $link->parent  = $result["parent_id"]; 
      $link->Page   = Model_Page::getPageById(new Integer($result["page_id"])); 
      $link->title  = $result["title"]; 
      $link->externalUrl = $result["external_url"]; 
      $link->sortOrder = $result["sort_order"]; 

      $objectList->add($link); 
      Model_Navigation::getNavigationByLanguageId(new Integer($result["id"]), $objectList, $language); 
     } 

     return $objectList; 
    } 

La fonction étant eval-ed est: Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));

Un peu plus explaination sur le code J'utilise cette fonctionnalité dans mon nouveau CMS. Un utilisateur peut concevoir un modèle et placer des widgets dans des régions définies, à l'instar de la fonctionnalité de portlet jQuery. Les widgets sont installés pour un site Web par moi, j'ai construit dans une option pour fournir un appel de fonction pour récupérer une liste d'objets quand un widget est marqué comme «contenu sélectif». Ce que j'essaye d'accomplir ici emploie eval pour retourner ArrayLists de la valeur de $ widget-> functionCall.

+0

Pouvez-vous inclure le code en question? –

+0

Pouvez-vous coller le code problématique s'il vous plaît? – rui

+0

Un échantillon de votre code peut nous aider avec nos réponses. Soit dit en passant, évaluez-vous une déclaration de fonction ou un appel de fonction? – Eineki

Répondre

5

Sur cette ligne, quel est le contenu de l'article $ widgetList-> ($ i) -> FunctionCall? $ itemList = eval ($ widgetList-> item ($ i) -> FunctionCall);

Pour eval pour retourner quoi que ce soit, $ widgetList-> item ($ i) -> FunctionCall DOIT commencer par le jeton return

par exemple, Si

$widgetList->item($i)->functionCall == 'return myFunc();'; 

alors vous êtes bien

Mais si

$widgetList->item($i)->functionCall == 'myFunc();'; 

Alors voilà pourquoi eval() est rien de retour. En outre, gardez un œil sur les erreurs générées lors de l'exécution de eval() - si le code ne parvient pas à analyser, ou déclenche une erreur quelconque, ce qui peut aussi expliquer pourquoi eval() ne renvoie rien.

Vous devriez être en mesure de supprimer l'appel à eval tout à fait, mais - au pire, utilisez call_user_func()

Edit: Pour votre exemple:

eval('return Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));'); 

Cela pourrait être écrit:

call_user_func(array('Model_Navigation', 'getNavigationByLanguageId'), new Integer(0), new ArrayList(), new Integer(7)); 

Ceci est probablement préférable, car il évite les frais généraux de compilation, est moins susceptible de casser, etc.

+0

Salut Frank! Le code contenant dans functionCall, dans ce cas particulier, est 'Model_Navigation :: getNavigationByLanguageId (nouvel entier (0), nouvelle ArrayList(), nouvel entier (7));'. L'ajout de 'return' dans la fonction eval a résolu le cas! Merci! +1 – Ben

1

Eval est le mal (et dans la plupart des cas hackish). Je suggère de poster votre code et nous pouvons peut-être faire disparaître cette partie du code pour vous.

0

Si vous exécutez le code en dehors de la fonction eval et il est OK, alors vous avez probablement besoin de vérifier la documentation de la fonction eval().

Assurez-vous que la chaîne à « évaluée » est « pas mal »/formaté correctement.

2

Si vous exécutez

function foo() { 
    bar(); 
} 
function bar() { 
    return 1; 
} 
$x=foo(); 
var_dump($x); 

la sortie sera NULL ` ». Bien que bar() renvoie une valeur, foo() ne le fait pas. La valeur de retour de bar() est "perdue". Même si vous utilisez eval()

function bar() { 
    return 1; 
} 
$x=eval('bar();'); 
var_dump($x); 
$x=eval('return bar();'); 
var_dump($x); 

impressions

NULL 
int(1) 
+0

Salut VolkerK, aussi, merci pour votre réponse! Il a fait l'affaire, mais je ne peux que signaler une réponse acceptée. +1! – Ben