PHP eval null döndürür ama bir dönüş denir

4 Cevap php

Bir var, ben oldukça kolay, bir soru düşünüyorum, ama ben ne yapıyorum yanlış anlamaya olamaz. Ben PHP'nin fonksiyonu eval ile çağrı bir işlevi var. Ben bir sonucu olarak elde etmek için bir, selfbuilt, ArrayList bekliyorum. Ama onun yerine ben kullandığınızda gettype Ben sonuç NULL olduğunu görüyoruz. Ben eval-ed fonksiyonu return kullanıyorum bile.

Bildiğim kadarıyla ben farkında değilim gibi ben belgeler bunu oynuyorum, ama bir şekilde çalışmıyor. Herhangi bir öneriniz?

Code fragment

<?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
                    }
                }
            ?>

Eval-ed code

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;
    }

Fonksiyonu olan eval-ed: Model_Navigation::getNavigationByLanguageId(new Integer(0), new ArrayList(), new Integer(7));

Some more explaination about the code I'm using this funcitonality in my new CMS. A user is able to design a template and place widgets in defined regions, pretty much like the portlet functionality jQuery is providing. Widgets are installed for a website by me, I have built in an option to provide a functioncall to retrieve a list of objects when a widget is flagged as 'Selective Content'.

Ne ben burada elde etmek için çalışıyorum eval $ widget> İşlevÇağrısı değerinden Dizi Listeleri dönmek için kullanıyor.

4 Cevap

On this line, what is the content of $widgetList->item($i)->functionCall ? $itemList = eval($widgetList->item($i)->functionCall);

Eval şey dönmek için, $ widgetList-> madde ($ i) -> İşlevÇağrısı belirteci ile başlaması ZORUNLU return

örneğin, eğer

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

o zaman iyisin

Ama eğer

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

Eval () bir şey dönen değil neden o zaman bu. Ayrıca neden eval () bir şey döndürüyor değil açıklayabileceği, kod ayrıştırmak için başarısız olursa, hata veya herhangi bir tür atar - Ayrıca, eval yürütülürken () oluşturulan herhangi bir hata için bir göz dışarıda tutmak.

En kötü ihtimalle, kullanın call_user_func() - Sen tamamen olsa eval çağrısı ile uzak yapmak gerekir

Edit: For your example:

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

Bu şekilde yazılmış olabilir

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

Bu derleme yükünden kaçınmak gibi, muhtemelen tercih edilir, vb kırmak için daha az olasıdır

Eval kötü olduğunu (ve çoğu durumda hackish). Ben kodu gönderirken öneririz ve biz belki de sizin için o kod kısmı ile yapabilirsiniz.

Eğer çalıştırırsanız

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

Çıktı 'null' olacaktır. Bar () bir değer döndüren foo rağmen () değil. Bar dönüş değeri () "kayıp". Aynı Eğer eval () kullandığınızda,

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

baskılar

NULL
int(1)

Eğer eval fonksiyonu dışında kodu çalıştırmak ve bu Tamam, o zaman muhtemelen eval () işlevi belgeleri kontrol etmek gerekir.

Emin "değerlendirilir" için dize düzgün biçimlendirilmiş / "yanlış değil" olduğundan emin olun.