Autor Zpráva
Martin Hampl
Profil
Dobrý den,
začínám programovat oop a nevím, jak předávat objekty mezi stránkami. Jedná se o objekt, který se mi stará o přihlašování. Pro jednoduchost napíšu něco jednodužšího co mi taky nefunguje..
Nejdříve vytvoření
class Auto
{
    public $barva = 'cervena';
    
    public function ukazBarvu()
    {
          return $this->barva;
    }
}
Následně testuju vytvoření
if($_SESSION['ferrari']=="")
{
$ferrari = new Auto;
}
else
{
$ferrari = $_SESSION['ferrari'];
}
Pak následuje pracování s metodama...
$barvicka=$ferrari->ukazBarvu();
echo $barvicka;
a na konci celého scriptu ukádám do session
$_SESSION['ferrari']=$ferrari;
Když tohle spusím, tak mi to vypíše cervena, ale když kliknu na refresh, tak už nic.
Co dělám špatně? A je vůbec nějaká jiná možnost ukládat objekty než pomocí session?
Davex
Profil
A session_start() na začátku skriptu máš? Jen připomínám, že před voláním této funkce také nesmí být žádný výstup.
Martin Hampl
Profil
Davex:
mám, úplně na začátku všeho...
+ taky jsem zkoušel funkčnost session (uložení textovýho řetězce..)


Davex:
Jo počkat.. To jakože před voláním téhle funkce nemůžu mít html??


Davex:
Já totiž mezi tagy <body></body> Dávám php include a tam píšu ten kod...
Alphard
Profil
Zcela na začátku stačí mít session_start(). Další kód už může být uvnitř stránky, ale návrhově šťastné řešení to není.
Martin Hampl
Profil

Alphard:
Jj session start() mám úplně na začátku.


Tak se omlouvám ale problém přetrvává. Ale zjistil jsem zajímavou věc. Když totiž definování objektu uzavřu do samostatného souboru, tak mi to nefunguje... tzn:
<?php
SESSION_START();

include "trida.php";
?>
<!DOCTYPE html>
<html lang="cs" dir="ltr">
  <head>
    <meta charset="UTF-8">
    <meta name="description" content="bla bla" />
    <meta name="keywords" content="bla bla" />
    <meta name="author" content="bla bla" />
    <title>bla bla</title>    
  </head>
  <body>
  <?php 
    $barvicka=$ferrari->ukazBarvu();
    echo $barvicka;    
    $_SESSION['ferrari']=$ferrari;
  ?> 
  </body>
</html>

Ale tohle už funguje:

<?php
SESSION_START();

class Auto
{
    public $barva = 'cervena';
    
    public function ukazBarvu()
    {
          return $this->barva;
    }
}
if($_SESSION['ferrari']=="")
{
$ferrari = new Auto;
}
else
{
$ferrari = $_SESSION['ferrari'];
}
?>
<!DOCTYPE html>
<html lang="cs" dir="ltr">
  <head>
    <meta charset="UTF-8">
    <meta name="description" content="bla bla" />
    <meta name="keywords" content="bla bla" />
    <meta name="author" content="bla bla" />
    <title>bla bla</title>    
  </head>
  <body>
  <?php 
    $barvicka=$ferrari->ukazBarvu();
    echo $barvicka;    
    $_SESSION['ferrari']=$ferrari;
  ?> 
  </body>
</html>  

Nevíte někdo přoč to nejde includovat?
Martin Hampl
Profil
Ano, tady bude zakopanej pes.. Když to dám do includu, tak se to chová tak, jak jsem psal nahoře... nejdříve to napíše červená, a po kliknutí na refresh nic...
Alphard
Profil
Nevidím žádný zřejmý důvod. PHP pro includované soubory nemění viditelnost proměnných ani žádné jiné vlastnosti, které by tady měly mít vliv. Opravdu je v includovaném souboru totožný obsah, jaký funguje při přímém uvedení?

Mimochodem, ačkoliv názvy funkcí jsou case-insensitive, velká písmena bývá zvykem používat pouze pro konstanty.
Jan Tvrdík
Profil
Alphard, Martin Hampl:
V době volání funkce session_start musí být třída jejíž objekt je uložený v session definovaná nebo přesněji instantiable (česky asi instanciovatelná), tedy stačí když je správně nastavený autoloading.


Lze to tedy vyřešit například takto:
<?php
include __DIR__ . "/trida.php";
session_start();
?>
<!DOCTYPE html>
...
Martin Hampl
Profil
Jan Tvrdík:
Tak jsem to vyzkoušel a funguje to. Děkuji.. Přesunul jsem akorát session start za třídu.


Jinak děkuji všem co napsali, trápil jsem se s tím dost dlouho...

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: