Autor Zpráva
henz
Profil *
Zdravím, na campu jsem měl php 5, a toto mi fungovalo normálně:
$muj_OBJ = (object) [];
while ($zbozi= $stmt->fetch(PDO::FETCH_ASSOC)) {
    $muj_OBJ->$['nazev'] = $zbozi['pocet'];
}
Ale ted když jsem stáhnul xampp s php 7.2 tak se mi zobrazuje Notice: Array to string conversion

Nevíte co s tím?


henz:
mám tam malý překlep v kodu á to být samozřejmě takto:
$muj_OBJ = (object) [];

while ($zbozi= $stmt->fetch(PDO::FETCH_ASSOC)) {
    $muj_OBJ->$zbozi['nazev'] = $zbozi['pocet'];
}



už vím, stačí tam přidat závorky
$muj_OBJ->{$zbozi['nazev']} = $zbozi['pocet'];
špatně sem googlil
Joker
Profil
A k čemu tam ten anonymní objekt je?
Vypadá to, že chcete v podstatě získat pole, proč nepoužít prostě array?

Takhle to bude složitější a (byť asi neznatelně) pomalejší a výhody tam nevidím.
henz
Profil *
Joker:
tim anonymním objektem myslíš $muj_OBJ? Dával jsem to jako příklad, ve skutečnosti nevytahuju zboží, ale nastavení (počet článků na stránků, počet komentářů zobrazených v článků na jednu stránku, a další věci). Jde jen čistě o přehledost abych se v tom dobře vyznal a neměl v tom guláš. Ale opravdu je tenhle proces tak pomalý že bych se tomu měl vyhnout? nenapdá mě jinak možnost jak bych to mohl udělat. To bych musel napsat fetchAll, a potom bych to psal takto ($settings namísto $zbozi) $settings[1]->pocet, ale co je to zrovna na druhím místě si nebudu pamatovat. Jak by jsi to udělal ty?


a nebo to nezapisovat do databáze ale do souboru php


nebo jsi tim anonymním objektem myslel tohle?
(object) []
mám za to že tohle je asi nejrychlejší způsob když chci takto jednoduchý objekt.
Joker
Profil
henz:
nenapdá mě jinak možnost jak bych to mohl udělat.
No jednoduše:
$muj_OBJ = (object) [];
 
while ($zbozi= $stmt->fetch(PDO::FETCH_ASSOC)) {
    $muj_OBJ[$zbozi['nazev']] = $zbozi['pocet'];
}
Joker
Profil
Ještě doplnění:
henz:
Ale opravdu je tenhle proces tak pomalý že bych se tomu měl vyhnout?

Rozdíl bude hodně malý, spíš jde o to, že v použití toho objektu nevidím žádnou výhodu.
henz
Profil *
Joker:
hm, to jo, lae zase nemusím psát uvozovky a hranatý závorky :-), pomlčka a šipka mi přijde přehlednější.
A to plnění do pole je rychlejší než do objektu nebo je to neměřitelné?
Joker
Profil
henz:
nemusím psát uvozovky a hranatý závorky
Tomu s uvozovkami nerozumím a místo hranatých závorek tam jsou složené a navíc pomlčka a většítko.
Porovnání těch zápisů:
// pole
$foo[$bar]
// anonymní objekt
$foo->{$bar}
henz
Profil *
Joker:
nechápu proč tam dáváš ty složené závorky, já píšu takto:
$zbozi->jablko // vrátí se číslo např. 35
ten tvůj zápis sem ještě nikdy v životě neviděl.


je anonymní objekt v něčem špatný? Já sem tento zápis co píšu já (object) [] viděl hodněkrát.
Joker
Profil
henz:
Jenže jak může skript u anonymního objektu z databáze vědět jaké má vlastnosti a jak se jmenují (aby to tam mohlo být natvrdo napsané)?
Navíc název „jablko“ fungovat bude, ale „mošt“ nemusí fungovat vždycky a „Coca Cola“ nebo „7up“ skončí chybou.

je anonymní objekt v něčem špatný?
Oproti poli mi to připadá méně přehledné a bude to pomalejší (u většiny použití nejspíš jen nepatrně).
Spíš jde o to, že tam nevidím výhody.

Ale možná to je tím ukázkovým příkladem, protože ten naznačuje, že mám v databázi v podstatě neznámé množství nějakých záznamů a ty nacpu jako vlastnosti objektu.
Tady je pole řekl bych praktičtější-

Na druhé straně, u té druhé alternativy zase typicky budu atributy toho objektu znát předem.
V tom případě mi ale přijde lepší mu udělat třídu a mít to jako standardní objekt. Výhodu vidím třeba v lepší přehlednosti při vývoji a údržbě; Například normální třídu si může IDEčko „očuchat“ a pak automaticky doplňovat názvy vlastností, vidím rovnou jaké všechny vlastnosti má, apod.
henz
Profil *
Joker:
hm, zajímavé. Máš pravdu že ta coca cola by nešla a já sem s tim dopředu počítal proto to taky odděluju podtržítkem.

Jenže jak může skript u anonymního objektu z databáze vědět jaké má vlastnosti a jak se jmenují (aby to tam mohlo být natvrdo napsané)?
a potřebuje to vědět?

Ale možná to je tím ukázkovým příkladem, protože ten naznačuje, že mám v databázi v podstatě neznámé množství nějakých záznamů a ty nacpu jako vlastnosti objektu.
$settings->pocet_clanku // 10
$settings->pocet_komentaru // 20
$settings->registrace // 0 nebo 1

já sem koupil yablkův php online kurz a on tam také vytvářel objekty z pole, protože se mu to psalo lépe a lépe to i vypadalo. Já v tom také výhodu nevidím.
Ale jestli tam je rychlostní rozdíl tak budu používat pole. Z jakého důvodu to je pomalejší? Přístup k objektu je samo o sobě pomalejší než k hodnotám pole?
Joker
Profil
henz:
a potřebuje to vědět?
Tak pokud bych tahal z databáze to zboží, jak vím, že tam je zrovna jablko?
Navíc v případě toho zboží asi budu chtít věci jako vypsat všechny položky a podobně, což jde s polem lépe.

S tím nastavením, kde ty položky jsou v podstatě dané, to bude použitelné lépe.
I když já bych spíš vytvořil normální třídu.
Protože s anonymním objektem když za rok budu přidávat nový kód, budu muset dohledávat, jestli počet článků je pocet_clanku, Pocet_clanku, PocetClanku, …
Načítání dat pravda nebude takhle triviální, ale nějaký automapper („pro každý výsledek z databáze: Pokud má objekt vlastnost stejného jména, přiřaď hodnotu“) nebude o moc složitější.

Já osobně většinou používám obrácený přístup, místo všech hodnot obsahuje konfigurační objekt jen metodu GetValue($key), takže by to bylo například $settings->GetValue("pocet_clanku"); (přičemž "pocet_clanku" by se měl vyhodit do nějaké konstanty).
Který přístup je lepší bude asi záviset na konkrétní situaci.

Z jakého důvodu to je pomalejší?
Práce s objekty v PHP znamená určitou režii navíc.
I když to bude zanedbatelné a je zbytečné se kvůli tomu objektům vyhýbat, zvážil bych to v situaci, kdy použití objektu nepřináší žádné zjevné výhody.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0