Jak funkci předat parametry uložené v poli?

Ivan Nový

Re:Jak funkci předat parametry uložené v poli?
« Odpověď #15 kdy: 24. 01. 2018, 01:17:38 »
Děkuji za info, a jak to udělat aby to byl objekt? Přeci se s tím líp pracuje jako s polem.
SPL


Kit

Re:Jak funkci předat parametry uložené v poli?
« Odpověď #16 kdy: 24. 01. 2018, 08:50:54 »
Děkuji za info, a jak to udělat aby to byl objekt? Přeci se s tím líp pracuje jako s polem.

Třeba takhle jednoduše:
Kód: [Vybrat]
<?php
$arr 
= array('a'=>'A''b'=>'B''c'=>'C');
$obj = (object) $arr;
zavolej($obj);
var_dump($obj);

function 
zavolej($obj) {
    
$obj->'D';
}

Ovšem není to OOP, je to jen práce s objektem.

BoneFlute

  • *****
  • 2 063
    • Zobrazit profil
Re:Jak funkci předat parametry uložené v poli?
« Odpověď #17 kdy: 24. 01. 2018, 14:47:01 »
Stovky položek nepředstavují problém, protože to pole se stejně předává odkazem.

Nepředávají. Odkazem se předávají jen objekty.

Pole se v PHP kopíruje líně, tedy až v okamžiku, kdy ho začneš modifikovat, což se běžně nedělá. Výkon tím tedy nijak netrpí.

To víme. Ale to jsi neřekl. Ty jsi řekl, že se v php pole předává odkazem. A to není pravda.

BoneFlute

  • *****
  • 2 063
    • Zobrazit profil
Re:Jak funkci předat parametry uložené v poli?
« Odpověď #18 kdy: 24. 01. 2018, 16:15:39 »
Ahoj,
když mám takový pole
Kód: [Vybrat]
$arr = ('a'=>'A', 'b'=>'B','c'=>'C'); //Jen nástřel, jedna se o velký polea potřebuji zavolat funkci a předat 4 parametry
Kód: [Vybrat]
zavolej_funkci('A','B','C');

Existuje několik řešení tohoto problému.

Pokud máš argumenty v poli, a chceš je jen předat jako argumenty funkci:
Kód: [Vybrat]
call_user_func_array('zavolej_funkci', $arr);To předpokládá správné pořadí v tom poli.

Nebo můžeš použít funkci extract, kterou ty argumenty z pole $arr rozpustíš do stejně pojmenovaných proměnných. A pak zavoláš přesně to:
Kód: [Vybrat]
zavolej_funkci($a, $b, $c, $d);Je to funkční, ale vůči lokálnímu kontextu dost drsné. Takže to dělej alespoň v nějaké funkci, ať si něco nepřepíšeš. Na druhou stranu to rovnou můžeš tu funkci volat:
Kód: [Vybrat]
zavolej_funkci($arr['a'], $arr['b'], $arr['c'], $arr['d']);Bude to čistější, bezpečnější a přehlednější.

Nebo taky můžeš chtít, že to pole je prostě pole, obsahuje hodně parametrů, a tak to do té funkce předej celé jako jeden argument:
Kód: [Vybrat]
zavolej_funkci($arr);To už ale trochu smrdí, a pouvažoval bych, zda to pole musí být opravdu tak velké. Opravdu ta funkce zpracovává všechny argumenty? (Třeba jo, neříkám nic.)

Vzhledem k tomu, jak to popisuješ bych zvolil:
Kód: [Vybrat]
zavolej_funkci($arr['a'], $arr['b'], $arr['c'], $arr['d']);
Nikdy nepředávej celé pole, pokud je to jen trochu možné.
« Poslední změna: 24. 01. 2018, 16:19:08 od BoneFlute »

Kit

Re:Jak funkci předat parametry uložené v poli?
« Odpověď #19 kdy: 24. 01. 2018, 16:44:38 »
Nebo taky můžeš chtít, že to pole je prostě pole, obsahuje hodně parametrů, a tak to do té funkce předej celé jako jeden argument:
Kód: [Vybrat]
zavolej_funkci($arr);To už ale trochu smrdí, a pouvažoval bych, zda to pole musí být opravdu tak velké. Opravdu ta funkce zpracovává všechny argumenty? (Třeba jo, neříkám nic.)

Nikdy nepředávej celé pole, pokud je to jen trochu možné.

Nevidím k tomuto doporučení žádný důvod. I velké pole v PHP předávám jako jeden argument. Je to tak mnohem přehlednější a ani výkon tím netrpí - spíše naopak. Běžně tak předávám např. celé $_GET nebo $_POST právě proto, že skript v tu chvíli netuší, které položky jsou vyplněny a které nejsou.


BoneFlute

  • *****
  • 2 063
    • Zobrazit profil
Re:Jak funkci předat parametry uložené v poli?
« Odpověď #20 kdy: 24. 01. 2018, 21:10:16 »
Nevidím k tomuto doporučení žádný důvod.

https://en.wikipedia.org/wiki/Dependency_injection

Vkládat celé pole je varianta https://en.wikipedia.org/wiki/Service_locator_pattern obecně považované za antipattern. To, že to není objekt, ale pole je jen nepodstatný detail. Princip a tím i problém je stejný.

Kit

Re:Jak funkci předat parametry uložené v poli?
« Odpověď #21 kdy: 24. 01. 2018, 21:36:52 »
Vkládat celé pole je varianta https://en.wikipedia.org/wiki/Service_locator_pattern obecně považované za antipattern. To, že to není objekt, ale pole je jen nepodstatný detail. Princip a tím i problém je stejný.

Nepleť si předávání pole (zde to ani není pole, ale slovník) se vzorem Service Locator a raději si přečti Clean Code, kde je tento postup doporučován místo většího než malého počtu parametrů.

BoneFlute

  • *****
  • 2 063
    • Zobrazit profil
Re:Jak funkci předat parametry uložené v poli?
« Odpověď #22 kdy: 24. 01. 2018, 21:45:19 »
Vkládat celé pole je varianta https://en.wikipedia.org/wiki/Service_locator_pattern obecně považované za antipattern. To, že to není objekt, ale pole je jen nepodstatný detail. Princip a tím i problém je stejný.

Nepleť si předávání pole (zde to ani není pole, ale slovník) se vzorem Service Locator a raději si přečti Clean Code, kde je tento postup doporučován místo většího než malého počtu parametrů.

Princip a tím i problém je stejný.

Ale dosti bylo krmení trolla.