Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno PHP - varování "Creating default object from empty value"

Zdravím,

mám menší problém v PHP s varováním "Creating default object from empty value".
Mám funkci parser, která z dodané instance třídy (jakožto formy pro vytváření dalších objektů) a výsledku MySQL dotazu vrátí pole různě nastavených objektů (podle počtu výsledků z DB). Parser funguje jak má (vrátí přesně to, co potřebuji, ale i přesto mi paradoxně pořád vyhazuje výše uvedený warning.

Zjednodušený kód:


require_once('res/Category');

function parser($res, $obj) {
      $var = 'id';
     
      foreach ($res as $r) {
            $obj->$var = $r[$var];  // zde mi to hází WARNING
      }
      
      return $obj;
}

parser($query, new Category());

Btw. varování vypínat nechci, pouze opravit, kde dělám chybu.

Předem děkuji.

Řešení:

Po spracovaní jedného prvku z poľa $res voláš unset($obj), takže pri spracovaní každého ďalšieho prvku je $obj nenastavený. Vtedy sa pri nastavení vlastnosti $obj->$var automaticky vytvára nová prázdna inštancia (default object). Riadok $obj = new $class() chceš mať zrejme vnútri cyklu, v ktorom prechádzaš pole $res.

Předmět Autor Datum
foreach ($res as $r) { $obj->$var = $r[$var]; // zde mi to hází WARNING } Tenhle cyklus je podivný,…
Wikan 08.07.2018 19:16
Wikan
Nenastavuje, mám před tím ještě část kódu, která z dodaného objektu vybere všechny názvy proměnných.…
Tex 08.07.2018 19:22
Tex
Možná jsi kód zjednodušil až moc - v tomto zjednodušení snad uvedené varování nevypisuje (nebo ano?)…
hynajs 08.07.2018 22:01
hynajs
Asi ano, vyzkoušel jsem zjednodušenou verzi a už mě to na nic neupozornilo. Přikládám tedy screensho…
Tex 08.07.2018 23:57
Tex
Po spracovaní jedného prvku z poľa $res voláš unset($obj), takže pri spracovaní každého ďalšieho prv…
los 09.07.2018 13:40
los
Ano, bylo to tím. Díky moc. Vzhledem k tomu, že unset() jinak nepoužívám, myslel jsem si že v tomto… poslední
Tex 09.07.2018 15:12
Tex

Nenastavuje, mám před tím ještě část kódu, která z dodaného objektu vybere všechny názvy proměnných. V uvedeném cyklu pak běží ještě jeden vnořený, který postupně nastavuje všechny proměnné (mění hodnotu $var a tím i nastavovaný parametr objektu).
Nechtěl jsem zbytečně příklad komplikovat, proto tam tato část není.

Asi ano, vyzkoušel jsem zjednodušenou verzi a už mě to na nic neupozornilo. Přikládám tedy screenshot svého původního kódu (akorát jsem trochu pozměnil vstupní parametry, namísto objektu dosazuji název třídy, to ale nic nemění).

Funkce:
[script01.png]

Volání funkce:
[script04.png]
*v proměnné $categories je uloženo pole výsledků z DB: Array ( [0] => Array ( [id] => 1 [0] => 1 [name] => Kategorie1 [1] => Kategorie1 ) [1] => Array ( [id] => 2 [0] => 2 [name] => Kategorie2 [1] => Kategorie2 ) )

Po spracovaní jedného prvku z poľa $res voláš unset($obj), takže pri spracovaní každého ďalšieho prvku je $obj nenastavený. Vtedy sa pri nastavení vlastnosti $obj->$var automaticky vytvára nová prázdna inštancia (default object). Riadok $obj = new $class() chceš mať zrejme vnútri cyklu, v ktorom prechádzaš pole $res.

Zpět do poradny Odpovědět na původní otázku Nahoru