"Static" osztály stringgé alakítása - nem
Halló újra mindenki!
Ha nem is BUG, megint egy PHP érdekesség:Mindez autoloaderen keresztül érhető el.
Ezután Azt hiszi nem definiált konstans.
Ez így jó? Mi lenne az ideális viselkedés?
■ Ha nem is BUG, megint egy PHP érdekesség:
<?php
class HTTPOutput
{
...
public static function __toString(){ return "valami" }
...
}
?>
Ezután
<?echo HTTPOutput;?>
Ez így jó? Mi lenne az ideális viselkedés?
Persze..
Valszeg azért, mert a __toString értéke sokszor függ a környezettől és a fejlesztők nem gondoltak arra / nem akarták, hogy valaki példány nélküli osztályokat hívjon meg. Ugyanis a PHPban is van GC és egy osztály addig nincs példányként a memóriában (ergo nem elérhetőek a függvényei) amíg min. 1 változó nem hivatkozik rá.
RTFM ;)
Nem nagyon függ a környezettől, ugyanis mindössze egyetlen esetben hívódik meg, ha közvetlenül az
echo
vagyprint
operandusa a példányosított osztály.Már boccs, de ez hülyeség: osztály metódusokat statikusan (tehát példányosítás nélkül) is meg tudsz hívni. Ráadásul a __toString függvény automatikusan ilyen, nem is kell elé a
static
kulcsszó.Felhő
RTFM ??
Ezt hol olvastad? Nem sok ertelme lenne ha a toString csak statikus lehetne. A toString arra szolgal h. az objektumot szoveges formaban adja vissza. Peldaul egy Ember osztalynal a nevet adhatja vissza. Ha statikus lenne akkor a nev tulajdonsag is sztatikus lehetne csak es annak mi ertelme h. minden Ember-t egyforman hivnak?
egyszerű, próbáld ki
Nem olvastam sehol, tudom, mert annó próbálgattam, és tudom, hogy mire szolgál. :)
Felhő
u.i. Az RTFM alapvetően a második rész miatt volt, illetve kicsit görbe tükör proclub stílusával szemben.
kiprobalva
a __toString metodus mint statikusan mint objektum metodusakent hivhato. Szoval reszben igazad volt. Statikusan viszon nem tolti be az eredeti szerepet, szoval nem hivodik alapban az echo parancsnal. Ilyenkor alapertelmezetten az osztaly neve irodik ki. Viszont nem igaz h. csak statikusan hivhato es ha objektum metodusakent van meghivva, akkor ugy mukodik ahogy kell.
nem is írtam ilyet
Megmutatnád, hogy hol írtam én ilyesmit?
Felhő
statikussag
Ha automatikusan statikus lenne, nem lehetne meghivni az egyedbol, ill. meghivni meg meg lehetne $obj->method() de akkor is statikusan viselkedik, tehat az egyed tulajdonsagait nem eri el. Ennek a __toString() eseteben nem sok ertelme lenne, es nem is igy mukodik. Erdekes dolog h. a statikussaga a meghivas modjatol fugg, de vegulis magikus metodusrol van szo :)
szövegkörnyezet
Felhő
nyelvi elemző
Egyszerűen ilyen a PHP nyelvi elemzője, bár igazában nem is nagyon látom értelmét, hogy miért lenne jó, ha önmagában használhatnád az osztály nevét.
Felhő
Statikus hozaferes
nem erről volt szó
Ezt írtam, amit viszont Te említesz, ott nem önmagában áll az osztály neve, hanem a :: operátor operandusaként.
Felhő
elnezest
Mi a kérdés pontosan?...
Statikus függvény van, így kell hívni pl.:
osztálynév::metódusnév (paraméterek);
,,echo osztálynév'' természetesen nem fog kiírni semmit, úgy látszik, konstansnak veszi ezen a helyen az osztálynevedet, ilyen nevű konstansod pedig nincs.
Ez a sor viszont már kell hogy működjön:
echo HTTPOutput::__toString ();
Közben rájöttem, Neked valószínű ez kell (példányosítani kell, az osztályt nem lehet string-gé alakítani, csak egy példányt):
echo $peldany;
> Nem sok ertelme lenne ha a toString csak statikus lehetne.
Szerintem is, a példány adatait kell feldolgozni; az osztállyal önmagában nem tudsz mit kezdeni.
> osztály metódusokat statikusan (tehát példányosítás nélkül) is meg tudsz hívni.
Kivéve, ha az osztálymetódusok belepiszkálnak a tagváltozókba. (És arra valók különben). A PHP elég laza nyelv ilyen szempontból. Fordításkor megengedi, hogy statikusan meghívj egy akármilyen függvényt, de futás közben hibát fogsz kapni, ha kiderül, hogy mégsem volt statikus. Szóval amihez nincs odaírva, hogy ,,static'', azt jobb mindig példányon keresztül hívni.
static kulcsszó
Ez nem egészen így van. Az első mondat a PHP4-re igaz volt, de ott még nem volt statikus függvény. PHP5-ben viszont nem tudsz egy nem statikus függvényt :: operátorral meghívni, szóval ez nem fordulhat elő.
Felhő
Nálam előfordul
error_reporting (E_ALL);
class osztaly
{
private $_valtozo;
public function fuggveny ($param)
{
return "param: $param<br/>\n";
// return "param: $param<br/>_valtozo: $this->_valtozo<br/>\n";
}
}
echo osztaly::fuggveny ("Szia");
?>
Ha csak az első return-sort aktiválom, gond nélkül lefut a függvény. Ha csak a másodikat, akkor futásidejű hibát ad (illetve figyelmeztet, de ez természetesen programhiba). Szóval én óvatosságra intenék a ::-os hívásokkal kapcsolatban.
Főleg, ha nincs bekapcsolva az error_reporting, amire ha jól emlékszem, pont Te hívtad föl a figyelmemet - ezúton is köszi!
E_STRICT
Felhő
ja