Autor Zpráva
seeyouinhell
Profil
ahoj, zajímá mě jaký je rozdíl mezi těmito zápisy,oba vykonávají stejnou funkci:
<?php
    $ahoj[1]="tepic";
    echo $ahoj[1];
    
    $cus=array(1=>"tepic2");
    echo $cus[1];
?>
ShiraNai7
Profil
Rozdíl je pouze v syntaxi. Ale používal bych druhou variantu jelikož je na první pohled jasné, co se děje. První varianta se může chovat divně, pokud proměnná $ahoj již existuje.
Majkl578
Profil
S prvním zápisem velmi opatrně, proměnná nemusí být definována nebo nemusí být polem. Na PHP 5.4:
$ahoj = 'ahoj';
$ahoj[1] = 'tepic';
var_dump($ahoj); // atoj
ShiraNai7
Profil
Majkl578:
proměnná nemusí být definována

To PHP nevadí. PHP dovoluje inicializovat implicitní prázdné pole tímto zápisem. Vadilo by pouze kdyby byla definována a nebyla by polem. Ale je přehlednější inicializovat jasným zápisem alespoň to první pole .

Viz příklad:
($a ani žádné z jeho klíčů neexistuje)

ini_set('display_errors', '1');
error_reporting(E_ALL | E_STRICT);

unset($a); // a vazne neexistuje
$a['b']['c']['d']['e'] = 'ahoj';

var_dump($a);

Výsledek:

array(1) {
  ["b"]=>
  array(1) {
    ["c"]=>
    array(1) {
      ["d"]=>
      array(1) {
        ["e"]=>
        string(4) "ahoj"
      }
    }
  }
}

Žádná chyba ani notice.
Majkl578
Profil
[#4] ShiraNai7: Podal jsem to trochu nešťastně, spíše tam mělo být nemusí být uživatelem definována. Jde například o případ, kdy je povolená diretiva register_globals (což je sice dnes již poměrně neaktuální, nicméně stále se sem tam objeví někdo, jehož hosting má tuhle otřesnost povolenou). Třeba tato třešnička.
Určitě je ale vhodné se na to nespoléhat, kdo ví, s čím PHP přijde v dalších verzích.
Už teď například nejde tímto způsobem použít přiřazení vlastnosti (neexistujícímu) objektu:
$x->foo = 1;
V PHP 5.2 a 5.3 generovalo hlášku úrovně E_STRICT (Strict Standards: Creating default object from empty value).
V PHP 5.4 generuje hlášku úrovně E_WARNING (Warning: Creating default object from empty value).
ShiraNai7
Profil
Majkl578:

Určitě je ale vhodné se na to nespoléhat, kdo ví, s čím PHP přijde v dalších verzích.
No určitě bych nespoléhal na vytváření pole z neexistující proměnné (to je podle mě fuj).
Ale automatická inicializace pod-polí už v existujícím poli bude určitě podporována i do budoucna (rozbilo by to spoustu kódu).
// $a neexistuje - tohle funguje ale neni to ciste reseni
$a[1][2][3] = 'neco';

// tohle funguje stejne ale je to prehlednejsi a neselze v pripade ze $a jiz existuje a neni pole
$a = [];
$a[1][2][3] = 'neco';

// takhle by se to muselo delat, kdyby tato featura vubec neexistovala
$a = [];
$a[1] = [];
$a[1][2] = [];
$a[1][2][3] = 'neco';

Už teď například nejde tímto způsobem použít přiřazení vlastnosti (neexistujícímu) objektu:
To je dobře. Ale u polí to má své využití. Nicméně mohli by toto chovaní zrušit pokud neexistuje ani ta základní proměnná.
Majkl578
Profil
ShiraNai7:
bude určitě podporována i do budoucna (rozbilo by to spoustu kódu)
Tohle rozhodně nepovažujme za obecné pravidlo. Krásným příkladem může být převod pole na string. Ještě do nedávna to bez problémů fungovalo a z pole se stal string Array. Od PHP 5.4 taková konverze generuje E_NOTICE. A také to rozbilo spoustu kódu, i u velkých věcí jako Drupal, Nette atd.

(string) [];
Notice: Array to string conversion

Ale u polí to má své využití.
A u objektů by mohlo mít naprosto stejné. I objekt může fungovat jako key-value, podobně jako pole (s tím, že se liší v přístupu k datům, plus je reprezentován instancí stdClass, nikoliv pole). Koneckonců mezi objektem a polem jde obousměrně převádět: (object) [] a (array) (object) [].
ShiraNai7
Profil
Majkl578:
A u objektů by mohlo mít naprosto stejné. I objekt může fungovat jako key-value
Ano, může. Takové chování lze implementovat např. pomocí __set(), pak je možné (bez chyb) následující:

$a = new mojetrida;
$a->b->c = 'ahoj';

Ale zrovna u objektů to nemusí být očekávané chování, tak proto E_NOTICE/WARNING. U polí tomu tak není. Ty mají vždy stejnou funkcionalitu. Ale jak jsem psal.. vytváření prázdného pole v případě neexistující základní proměnné by mohli zavrhnout.

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: