Autor Zpráva
snazimse
Profil
Zdravím,

chci se zeptat, na takovou jen zajímavost.Určitě to nepoužiju, ale jen by mě to zajímalo, jak to funguje
nedohledal jsem to.

Dá se nějak v OOP, přistoupit přes instanci k proměnné definované uvnitř nějaké funkce.

Příklad: Když je v konstrukturu, tak samozřejmě ok, ale kdybych ji chtěl získat z funkce, kde jen tam je definovaná, pokud ji nevrátím, nebo podobně, dá se to, v praxi udělat, člověk to nepotřebuje, ale jen mě to zajímá.

A jak je to ve statické funkci?

class Something {

 public function __construct()
    {
        $this->name = "var";

    }

 public function myVariable()
  
    {  
      $this->name = "changevar";    
      
      } 

 }

 $inst = new Something;
 echo $inst->name;
 //from function
 echo $inst->myVariable()->name;
 

Děkuji všem!
weroro
Profil
snazimse:
echo $inst->myVariable()->name;
Ak by si to chcel takto, tak tá funkcia by musela vrátiť nejaký objekt, v ktorom je definovaná premenná name. (teda aspoň teoreticky, neviem, či je v PHP takýto zápis vôbec dovolený)

$this->name = "changevar";
Týmto spôsobom prepíšeš premennú mimo metódy a tak by bola prístupná v $inst->name
Čiže takto:
$inst->myVariable();
echo $inst->name;
snazimse
Profil
weroro:

Díky za pomoc.
Takže, prvně načtu metodu, a pak z ní vytáhnu tu proměnnou.Jinak to nejde?

Mě zajímá právě jaké jsou možnosti. Jasně, že by se dalo napsat, něco jen na vrácení.
A jak je to u statické metody?

Tam se dostanu přímo k proměnné definované takto self::$name = "Petr"; jak?

A na závěr, taková specialitka u OOP, si můžu neobjektovou proměnnou,
předávat jen uvnitř nějaké metody či funkce.K ní nemůžu už přistoupit, chápu to správně.
Protože instance, očekává objekt.

Je tak viz příklad s komentářem.

Příklad
// tady nelze získat přístup, k této neobjektové proměnné když jsem v OOP, je to tak? Takže si to vždy musím předat do té objektové?
$firstname = "Petr";

//zde již získám přístup, pak v instanci
$this->name = $firstname;


Děkuji předem za pomoc!
Alphard
Profil
1. Lokální proměnné v metodách se chování stejně jako ve funkcích. Výsledky z funkce lze předávat buď návratovou hodnotou (return), referencovaným parametrem, nebo (v nejhorším případě) úpravou globálních proměnných.

Jiná možnost neexistuje, přístup $objekt->metoda()->promenna; je jen syntaktický cukr pro vrácení objektu a přístup k jeho vlastnosti, tj.
$obj2 = $obj->metoda();
$obj2->promenna;

Přístup k vlastnostem objektu je něco trošku jiného, právě proto, že je to vlastnost celého objektu a nikoliv lokální proměnná v jedné metodě. Přístup k ní je zprostředkován přes ukazatel na objekt $this, který PHP zpřístupňuje ve všech nestatických metodách. Je-li daná vlastnost veřejná, lze se k ní dostat i z venku a předávat takto hodnoty (ale chová se to trochu jako globální proměnné v omezeném kontextu, je lepší se tomu v začátcích vyhnout).

2. Statická vlastnost patří třídě, nikoliv konkrétní instanci. V pozadí je trochu jiný mechanismus, má to trochu jinou syntaxi a jiné použití, ale v principu je to stejné.

3. Specialitka OOP. Opět nejde o specialitku OOP, ale běžnou vlastnost i u klasických funkcí. Proměnné „z venku“ (neglobální) nejsou uvnitř funkce dosažitelné. Tady je to jen rozšířeno na kontext třídy.

Povinné čtení, než položíte další dotaz, www.pehapko.cz/zakladni-kurz/14-rozsah-platnosti a dle potřeby předchozí díly
snazimse
Profil
Alphard:

Díky moc!

Perfektní vysvětlení. A jak se dá docílit toho syntaktického cukru, jakoby naoko, v nějakém frameworku?

Mě to ,ale nefunguje ten příklad, funguje mi ten co uváděl weroro.
Anebo jsem si udělal, to pracuje.
$objekt2 = $objekt->myVariable();
 echo $objekt2.$objekt->name;

Ale ten váš mi vrátí null.Jakto?

A taky jsem nenašel jak zapsat to u te statické funkce s operátorem ::

Jinak ok a chápu!
Alphard
Profil
class User
{
    public $name;
    public $age;

    public function __construct($name, $age)
    {
        $this->name = $name;
        $this->age = $age;
    }
}

class Users
{
    private $users = [];
    public static $statickaVlastnost = 42;

    public function __construct()
    {
        $this->users[] = new User('Tonda', 25);
        $this->users[] = new User('Lenka', 22);
    }

    public function getUser($id)
    {
        return $this->users[$id];
    }
}


$users = new Users();
echo $users->getUser(1)->name; // vypise Lenka

Udělat totéž pro statickou proměnnou je trochu složitější a zase je více možností, které tady radši nebudu rozebírat. Typicky se statická proměnná volá přes jméno třídy, tj. Users::$statickaPromenna, od PHP 5.3 lze volat $users::$statickaPromenna, dál to začátečník nemusí řešit.
snazimse
Profil
Alphard:

Děkuji, ale mě šlo o to jak se to volá zase stejně ale ve statice, tzn ze statické funcke. Tohle už vím dávno, že se tak volají ovšem musí být definovány v konstruktoru.
Mě šlo přímo o to ,jak ze statické metody přímo o tom jsem mluvil ne o takovém volání.

Příklad:
public static function Name()
{
 self::$Neco = "get value";
} 

K statické proměnné uvnitř statické funkce, k té se potřebuji dostat, jako to bylo v metodě skrze instanci, to mě zajímá, jestli to jde a jaký je zápis, protože jsem to nikde nedohledal.
Zápis, co uvádíte, je všude.

Možná jsem to špatně vysvětlil, nevím, pak se omlouvám!

Možná se na to spíše používají konstanty, ale tak jsem chtěl vědět, jakým zápisem, se to dělá.

Děkuji!
Alphard
Profil
Ta statická proměnná neexistuje jenom v kontextu metody, ale celé třídy, rozumné (pouze syntakticky) použití je toto
Trida::Name();
echo Trida::$Neco;
snazimse
Profil
Alphard:

Rozumím, proto je statická, chápu to dobře?

Děkuji!

Ovšem, funguje mi to jak si představuju, jen takhle.

Trida::Name();
echo Trida::$Neco;

Ta závorka mi háže fatal err, takže to asi není dobře, nevím.String to samozřejmě je.
Viz:
Function name must be a string on line 25
Trida::Name();
echo Trida::$Neco();
Alphard
Profil
Ta druhá závorka byla moje chyba, už jsem to opravil.
snazimse
Profil
Alphard:

Ok, dobře.

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