Autor Zpráva
d.b.cooper
Profil *
Zdravim,
mam dotaz zkusil jsem jednoduchý příklad a nechápu chodvání

pokud dám vypsat

$dat2 = new DateTime();
//var_dump($dat2);
var_dump($dat2->date);

stránka vrátí error

pokud odkomentuju
var_dump($dat2);

vypíše se objekt a pak normálně ve stringu datum ... ?

používám nette framework ale pokud to dobře chápu ten by na to neměl mít vliv
jak mám vypsat ve stringu pouze datum ? žádná fce getDate neexituje :/

díky za jakoukoliv odpověď
aDAm
Profil
a ten error je jaky?
juriad
Profil
To je z důvodu, že atribut $date není veřejný, ale z nějakého důvodu je veřejně přístupný. Metoda __toString tento atribut vytvoří a naplní. Není-li nějaký atribut či metoda zmíněná v dokumentaci, nepoužívej ji, není nikde řečeno, že po upgradu stále bude existovat ani, že se bude chovat stejně.
Dokonce ani není v dokumentaci řečeno, co vrátí metoda __toString, proto bys na její výsledek neměl spoléhat. Můžeš ho používat pro ladění/logování, ale ne k implementaci logiky.

$dat2->format('Y-m-d');

aDAm:
PHP Notice:  Undefined property: DateTime::$date in /home/adam/bordel/djpw/p.php on line 7
d.b.cooper
Profil *
ok diky
aDAm
Profil
juriad:
připadáš si teď jako velký drsňák? Co jsem chtěl tazateli naznačit že je vhodné před pokládáním dotazu na forum zkusit se podívat na error a do dokumentace k PHP...
juriad
Profil
aDAm:
Tvého příspěvku jsem si všimnul až poté, co jsem odeslal svůj. Původně jsem tam reakci na tebe neměl, ale doplnil jsem ji dodatečně.
Předpokládal jsem, že d.b.cooper znění chyby zná, a já si to musel nasimulovat, abych ji zjistil. Udělal jsem to, protože mě to zajímalo. A protože chyba nebyla na první pohled zřejmá, přidal jsem po prečtení tvého příspěvku její znění.

Tvoji otázku jsem považoval za rutinní, která se pokládá v případě, že není jasné, kde je chyba, a nebo když simulace chyby je obtížná. Teď už chápu, o co ti šlo. Nemyslím si, že by tvá otázka d.b.cooperovi příliš pomohla. Nejspíš se ještě nesetkal se situací, kdy nedokumenovaný atribut někdy funguje. Proto jsem se také rozepsal o nevhodnosti používání nedokumenovaných vlastností.

A ne, nepovažuji se za velkého drsňáka, snažil jsem se jen napsat úplnou odpověď s vysvětlením.
d.b.cooper
Profil *
hlavní je že jsem se dostal rychle k informaci co jsem potřeboval a to je ta že se datum získá metodou format() což by mě nenapadlo pokud bych neprošel všechny metody třídy DateTime hledal jsem nějaký getNěco... prože jsem viděl ve výpisu že existuje proměná date

vypadá to že logicka jde u OOP celá stranou a nadchází doba šprtání manuálů (kvůli tomu jsem s programováním opravdu nezačínal *)
ve všem nejdřív hledám logiku a pak mě někdo odkáže na 150 stránkový manuál v AJ který krkolomě překládám v google translatoru protože AJ nikdy nebyla moje silná stránka :/

nešlo mi hlavně do hlavy jak jednou var_dump() může vyhodit hodnotu a jednou error i když jedinou předchozí změnou je výpis ...

chápu to teď tak že zavolání výpisu var_dump($object) spustí nějaké předdefinané metody (při spuštění ? ...) a ta naplní jinak nenaplněnou proměnou instance objektu (která není v manuálu a nemá se proto používat => protože není oddladěná v tomto případě naplněná za všech podmínek)

* dělal jsem 2+2 roky ve firmách s vlastním CMS kde bylo OOP v opravdu malé míře [pár tříd pár jednoduchých volání metod] a proto jsem s OOP tak pozadu :)

ještě jednou díky za odpovědi
juriad
Profil
Princip OOP je takový, že každá třída má definované veřejné API, které musíš používat. Vždy si musíš v dokumentaci najít, co daný objekt umí. Nespoléhej se na výpis var_dumpu, ten zobrazuje interní reprezentaci, která tě nezajímá, protože ji nijak nemůžeš využít.

To, že musíš používat jen ty metody a atributy, které autor určil jako veřejné je důvod, proč OOP je tak rozšířené. Můžeš se spolehnout, že to bude fungovat. Nemáš možnost průběh výpočtu ovlivnit jinými způsoby, než které ti dovolí autor té třídy.

Napadlo by tě někdy provést toto?
$res = mysql_query("SELECT 1");
var_dump($res);
Ne. Protože víš, že s tím co vrátí mysql_query nemůžeš pracovat přímo, ale jen pomocí k tomu specializovaných funkcí. Toto je velice podobné.

Pokud máš zdrojové kódu těch tříd k dispozici, tak ti jejich metody a atribute bude IDE navrhovat, nemáš-li je dostupné (jako v případě třídy DateTime, která je implementovaná v C), musíš postupovat jen podle dokumentace.
http://cz1.php.net/class.datetime#datetime.synopsis - tady máš přesně popsané, co třída DateTime nabízí. Nikde není zmíněný atribut $date ani není uvedená metoda __toString (která je ale implementovaná implicitně).

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: