Autor | Zpráva | ||
---|---|---|---|
Darker Profil |
Atáhl jsem si tuto třídu, která má pracovat s polygony. Funguje dobře, ale neustála zvrací hromady těchto zpráv:
Deprecated: Assigning the return value of new by reference is deprecated in [...] on line[...] $is =& new vertex($ix[$i], $iy[$i], $s->Xc(), $s->Yc(), $s->d(), NULL, NULL, NULL, TRUE, NULL, $alphaS[$i], FALSE, FALSE); Po umazání ampersandu skript hlásí následující chybu: Call to a member function id() on a non-object bla bla bla $is =& new vertex(/*...*/); $ic =& new vertex(/*...*/); $is->setNeighbor($ic); $ic->setNeighbor($is); $this->insertSort($is, $s, $this->nxt($s->Next())); $polyB->insertSort($ic, $c, $polyB->nxt($c->Next())); function insertSort (&$nv, &$s, &$e) { $c =& $s; // Set current to the sarting vertex while ($c->id() != $e->id() && $c->Alpha() < $nv->Alpha()) $c =& $c->Next(); // Move current past any intersections |
||
Alphard Profil |
#2 · Zasláno: 7. 11. 2012, 23:07:00
Nedávno tady bylo jiné vlákno, kde snad bylo vysvětleno, že od PHP verze 5 se objekty předávají referencí defaultně a zde popsané chování je chybné (možná je to jen ze staré verze).
Vypínat to hlášení je samozřejmě hloupé a je třeba to přepsat. |
||
Darker Profil |
#3 · Zasláno: 8. 11. 2012, 11:01:24
Alphard:
„je třeba to přepsat.“ Když to nahrádím a napíšu pouze „=“ skript přestane fungovat. |
||
ShiraNai7 Profil |
#4 · Zasláno: 8. 11. 2012, 11:05:41
Darker:
Tak to budeš muset přepsat tak, aby to fungovalo :) Co ti na to máme napsat.. Pokud to je starý kód který používá reference tímhle způsobem a nefunguje bez toho, tak máš smůlu. Umazání ampersandu před new nemůže ovlivnit funkčnost (v PHP 5 je to stejně reference ať tam & dáš nebo ne). |
||
Darker Profil |
#5 · Zasláno: 8. 11. 2012, 18:22:33
|
||
Jan K Profil * |
#6 · Zasláno: 9. 11. 2012, 23:32:09
Darker:
Vážně ti doporučuji (samozřejmě i řadě jiným) zavřít internet, nakoupit knížky (ideálně anglické, z českých lze ale také vybrat) a prostě se naučit základy jazyku a programování, trávit v počátcích čas na diskuzích je hloupost. Jednak se stejně moc nových věcí nenaučíš a jednak často akorát odrazuješ ty zkušenější, kteří by ti i občas rádi pomohli, ale tyhle dotazy jsou prostě o ničem :). "Nejvíc mě štve, že hlášení těch zpráv nejde vypnout vhodným nastavením error reporting" Ale ano, lze :) error_reporting(E_ALL & ~E_DEPRECATED);
"Takže kecám? Vážně jsem to zkoumal, ale oparvdu stačilo vymazat jeden ampersand u new a skript přestal fungovat. (PHP/5.3.8)" Tady se motají jablka a hrušky dohromady. Ampersand je syntaxe pro předání reference, od php 5 všechny objekty jsou automaticky předávány s referencí. Tenhle skript je ale naprostá příšernost a on potřebuje reference, aby s danou proměnnou mohl v dalším průchodu pracovat, takže je opravdu možný, aby se to rozbilo. Počítání s polygony je zrovna velice zajímavá úloha, v novějším php už je řešitelná mnohem jednodušeji, přiložený skript nemá smysl upravovat pro novější php, raději si ho napiš znovu :) |
||
Darker Profil |
#7 · Zasláno: 11. 11. 2012, 16:22:16
Jan K:
„Vážně ti doporučuji (samozřejmě i řadě jiným) zavřít internet, nakoupit knížky (ideálně anglické, z českých lze ale také vybrat) a prostě se naučit základy jazyku a programování, trávit v počátcích čas na diskuzích je hloupost. Jednak se stejně moc nových věcí nenaučíš a jednak často akorát odrazuješ ty zkušenější, kteří by ti i občas rádi pomohli, ale tyhle dotazy jsou prostě o ničem :).“ Jsem rád, že mi tuhle neužitečnou radu dal někdo až v době, kdy už vím, že je mi k ničemu a nemůže mě tak zmást. „Ale ano, lze :) error_reporting(E_ALL & ~E_DEPRECATED);“ Nefungovalo dokud jsem výše uvedené nenapsal do php.ini. „a on potřebuje reference, aby s danou proměnnou mohl v dalším průchodu pracovat, takže je opravdu možný, aby se to rozbilo.“ Podle toho co tvrdíš ty, i všichni před tebou, operátor new referenci předává automaticky. Takže ampersand by měl udělat z reference referenci na referenci a nebo neudělat nic. „novějším php už je řešitelná mnohem jednodušeji“ Copak snad ve verzi 5 přibyly nějaké geometrické funkce? |
||
Alphard Profil |
#8 · Zasláno: 11. 11. 2012, 18:04:26
Darker:
„i všichni před tebou, operátor new referenci předává automaticky“ Já jsem tady už neodkazoval na manuál, možná jsem měl http://php.net/manual/en/language.oop5.references.php Mluvit o předávání referencí tak jsou známy z & není přesné. Kombinace =& new způsobí vytvoření "referenci na referenci" (v uvozovkách, protože ta druhá reference je trošku něco jiného). Je zřejmé, že skrýt chyby a pracovat s tímto je šílenost. Už jen proto, že v PHP 5 se myslím změnil i způsob předávání referencí do funkcí.
„Copak snad ve verzi 5 přibyly nějaké geometrické funkce?“ Myslím, že tím byly myšleny lepší možnosti OOP, ale nemohu mluvit za autora. O geometrických funkcích nevím. |
||
Časová prodleva: 11 let
|
0