Autor Zpráva
4ever
Profil
Ahoj,
je možné zkrátit tento zápis?

   $w = ($what == 'effect') ? 'e' : 'c'; 
   $ref =& $this->argLists->methodNames->$w;
   if ($this->type[$what]){
     foreach($this->type[$what] as $level => $method){
      $keyword = $ref[$method];
     }
   }

místo nefunkčního:
$this->argLists->methodNames->$w[$method]

používám proměnnou $ref. Když je podobných situací v kódu více, stává se nepřehledný.
Nox
Profil
radši použij nějaký editor s napovídáním (code completition), kód se většinou častěji čte než píše, raději to zapiš normálně a je to

pokud ale ty -> jsou vlastně __call / __get, tak to může kód urychlit a pak by to bylo ok (hlavně tím, že je to v cyklu)

hlavně myslim že - to zhoršení je, protože to pojmenuješ nesmyslně $ref ... kdybys to pojmenoval podle toho, co to je, bylo by to o dost přehlednější

navíc tady nemusíš používat referenci, pokud tomu neplánuješ měnit hodnotu (hodnota je po přiřazení kopírována teprve pokud se změní, jinak
oba ukazují na stejnou hodnotu, viz phpfashion: černá magie optimalizace)
4ever
Profil
Nox:
radši použij nějaký editor s napovídáním (code completition)
Tohle jsem nepochopil...

Proč jsem použil referenci má dva důvody. Je to tam pro jistotu, kdyby se nejednalo o objekt. Často odkazuji buď na objekt nebo na vlastnost objektu, která je pole. A jelikož pole není objekt tak by zřejmě docházelo ke kopírování. Jelikož je to v metodě, která se často volá a dále pak uvnitř vnořených smyček, přijde mi vhodné použít referenci.

Ten druhý důvod: stejný nebo velmi podobný název pro všechny reference, aby se tato reference dala snadno najít (zmáčknutí F3). Hlavně mi přijde zbytečný to pojmenovat podle toho co to je, když to vidíš (obvykle o jeden řádek výše):
$ref =& $this->argLists->methodNames->$w; 

PS: Ten odkazovaný článek je na mě moc složitý, ale stejně raději ponechám =& .
Nox
Profil
4ever:
Ten odkazovaný článek je na mě moc složitý, ale stejně raději ponechám =& .
s tímhle přístupem asi nemá cenu abych odpovídal :)

Článek jasně popisuje, že při prostém přiřazení se prostě nekopíruje, pokud nemícháš reference a přiřazení

Přijde mi, že tímhle se spíš stává kód kryptičtějším, jestli máš všude $ref a pokaždé je to úplně něco jiného...


Ještě pořád vlastně nevím, proč používáš tu referenci a proč to potřebuješ nějak krátit
Celý ten kód je zvláštní, když v cyklu přiřazuješ do stejné proměnné pořád něco jiného ... je stejné, jako bys tam hned dal poslední položku

(btw 'e' a 'c' znamená co? abys to věděl i za měsíc třeba)


Jinak ... pokud potřebuješ něco krátit, tak to třeba dej celé do funkce/metody
4ever
Profil
Nox:
Ještě pořád vlastně nevím, proč používáš tu referenci a proč to potřebuješ nějak krátit

To jsem psal v prvním příspěvku. Nemohu použít zápis
$this->argLists->methodNames->$w[$method]
Protože tím se nedostanu k vlastnosti $method.

Chci zpřístupnit vlastnost, která je uložená pod $this->argLists->methodNames->$w a jméno vlastnosti nese proměnná $method
proto to chci zkrátit.

Referenci používám proto, že jinak mi to dělá bordel a "zásobník" se mi přepíše nějakýma jinýma hodnotama co tam nemají být.

To "e" a "c" si budu pamatovat protože to je stavebním kamenem té aplikace. Je to zkratka pro "effect" a "condition".
Majkl578
Profil
4ever:
místo nefunkčního:
>
$this->argLists->methodNames->$w[$method]
Co je na tom nefunkčního? Jen to neumíš správně zapsat:
// prototyp toho, co tam máš ty
$argLists = new stdClass;
$argLists->methodNames = new stdClass;
$argLists->methodNames->foo = array('a' => 'b');
$w = 'foo';
$method = 'a';

   var_dump($argLists->methodNames->{$w}[$method]); // b
Mimochodem, i to co jsi poslal by "fungovalo" (ve smyslu, že by to nespadlo na parse erroru), jen ne jak očekáváš - v PHP 5.4 by to (na mém prototypu) snažilo volat $argLists->methodNames->f.

Ten kód v [#1] se mi ani trochu nelíbí, je neprůhledný a zavání pokusem oslnit složitostí (navíc reference je zbytečná, jak už zmínil Nox). Proč používáš tak zřetězené volání? Není to jen chybný OO návrh?
4ever
Profil
Majkl578:
Mimochodem, i to co jsi poslal by "fungovalo" (ve smyslu, že by to nespadlo na parse erroru)
Ale to já vím, funkční to je, špatně jsem se vyjádřil. Ale nelze to použít pro to, čeho jsem chtěl dosáhnout.

Ten kód v [#1] se mi ani trochu nelíbí, je neprůhledný a zavání pokusem oslnit složitostí (navíc reference je zbytečná, jak už zmínil Nox). Proč používáš tak zřetězené volání? Není to jen chybný OO návrh?
Proto jsem založil toto vlákno, abych se dozvěděl jestli to jde a jak to udělat. Viz "Když je podobných situací v kódu více, stává se nepřehledný. " A opravdu nešlo o pokus oslnit složitostí, ale o pokus dozvědět se jak to zjednodušit.

S tímto zápisem jsem se setkal poprvé, takže díky, je to skvělé řešení.

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