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[...]
Na moha místech jsem ze skriptu prostě umazal ampersand, pokud ho ale umažu třeba na tomto řádku, skript přestane fungovat:
$is =& new vertex($ix[$i], $iy[$i], $s->Xc(), $s->Yc(), $s->d(), NULL, NULL, NULL, TRUE, NULL, $alphaS[$i], FALSE, FALSE);
Nejvíc mě štve, že hlášení těch zpráv nejde vypnout vhodným nastavením error reporting, což dělá skript, který má generovat data a ne HTML zcela nepoužitelným.


Po umazání ampersandu skript hlásí následující chybu:
Call to a member function id() on a non-object bla bla bla
A takhle to vypadá:
                                $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()));
A metoda insertSort:
    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
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
Alphard:
je třeba to přepsat.
Když to nahrádím a napíšu pouze „=“ skript přestane fungovat.
ShiraNai7
Profil
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
ShiraNai7:
Umazání ampersandu před new nemůže ovlivnit funkčnost
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)

Stáhl jsem toto a toto.
Tady jsou skripty jak je mám ve složce. Umazat ampersand si můžeš na ř. 675.
Jan K
Profil *
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
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
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.

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