ugrás a tartalomhoz

"Static" osztály stringgé alakítása - nem

zottty · 2006. Május. 15. (H), 00.35
Halló újra mindenki!

Ha nem is BUG, megint egy PHP érdekesség:

<?php
class HTTPOutput
{
   ...

   public static function __toString(){ return "valami" }

   ...
}
?>
Mindez autoloaderen keresztül érhető el.

Ezután
<?echo HTTPOutput;?>
Azt hiszi nem definiált konstans.

Ez így jó? Mi lenne az ideális viselkedés?
 
1

Persze..

janoszen · 2006. Május. 15. (H), 08.09
Persze, PHPban nem tudsz osztálynevekre hivatkozni közvetlenül, ha jól tudom. Példányosítani kell és a példányt kell kiechozni.

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á.
3

RTFM ;)

Hodicska Gergely · 2006. Május. 15. (H), 10.03
Valszeg azért, mert a __toString értéke sokszor függ a környezettől

Nem nagyon függ a környezettől, ugyanis mindössze egyetlen esetben hívódik meg, ha közvetlenül az echo vagy print operandusa a példányosított osztály.

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á

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ő
4

RTFM ??

PAtrik · 2006. Május. 15. (H), 17.04
Ráadásul a __toString függvény automatikusan ilyen, nem is kell elé a static kulcsszó.

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?
6

egyszerű, próbáld ki

Hodicska Gergely · 2006. Május. 15. (H), 23.23
Ezt hol olvastad?

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.
8

kiprobalva

PAtrik · 2006. Május. 16. (K), 00.21
alaposan attprobaltam es a kovetkezore jutottam:
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.
11

nem is írtam ilyet

Hodicska Gergely · 2006. Május. 16. (K), 00.58
Viszont nem igaz h. csak statikusan hivhato

Megmutatnád, hogy hol írtam én ilyesmit?


Felhő
13

statikussag

PAtrik · 2006. Május. 16. (K), 09.55
Ráadásul a __toString függvény automatikusan ilyen, nem is kell elé a static kulcsszó.

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 :)
14

szövegkörnyezet

Hodicska Gergely · 2006. Május. 16. (K), 11.23
Kiragadtad ezt az egy mondatot, de előtte a mehívásról volt szó. Egy sima függvényt nem tudsz ugye statikusan meghívni, míg a __toStringet igen, szóval ebből a szempontból statikusnak tekinthető.


Felhő
2

nyelvi elemző

Hodicska Gergely · 2006. Május. 15. (H), 09.58
Ez így jó? Mi lenne az ideális viselkedés?

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ő
5

Statikus hozaferes

PAtrik · 2006. Május. 15. (H), 17.13
Az osztaly nevenek hasznalata a statikus tulajdonsagok ill. metodusok hozzaferesenel hasznos. Van ertelme szerintem annak amit zottty irt. Igy hirtelen nem tudok felhasznalasi lehetoseget, ahol erdemes lenne hasznalni.
7

nem erről volt szó

Hodicska Gergely · 2006. Május. 15. (H), 23.28
miért lenne jó, ha önmagában használhatnád az osztály nevét

Ezt írtam, amit viszont Te említesz, ott nem önmagában áll az osztály neve, hanem a :: operátor operandusaként.


Felhő
9

elnezest

PAtrik · 2006. Május. 16. (K), 00.26
Igen, igazad van. rosszul felyeztem ki magam. De akkor is zotty vedelmere kell kelnem. Ugyanugy ahogy echo $objektum->__toString(); roviditese az echo $objektum;, elvileg lehetne az echo Osztaly::__toString(); roviditese az echo Osztaly;. Kerdeses h. miert nem mukodik igy, de lehet komoly oka van.
10

Mi a kérdés pontosan?...

Kiskübi · 2006. Május. 16. (K), 00.55
Nincs statikus osztály.

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):
$peldany = new HTTPOutput;
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.
12

static kulcsszó

Hodicska Gergely · 2006. Május. 16. (K), 06.55
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.

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ő
15

Nálam előfordul

Kiskübi · 2006. Május. 17. (Sze), 22.40
PHP 5.1.2-t használok.
<?php

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!
16

E_STRICT

Hodicska Gergely · 2006. Május. 18. (Cs), 08.29
Köszi, jogos, nem figyeltem, nem alapban szól érte a PHP5, csak E_STRICT megadása esetén.


Felhő
17

ja

zottty · 2006. Május. 26. (P), 12.29
Annak amúgy sincs semmi értelme, hogy egy statikus függvényben nemstatikus memberekre hivatkozz :)