Deklarácia premenných v OOP PHP5

Prosím o objasnenie, kedy deklarovať viditeľnosť členskej premennej v PHP5? Očakával som, že pri nedeklarovaní premennej a jej následnom použití v triede nastane chyba, ale nestalo sa tak. Chcem si preto ujasniť, kedy sa musí používať deklarácia a kedy nie. Aké bolo chovanie v PHP4(OOP)? Načo je vhodné používať pseudopremennú $this-> ?
Ďakujem.
Zkus začít třeba tady:
http://interval.cz/clanky/objekty-v-php5/

Pokud nepotřebuješ OOP v PHP4, tak s tím ani raději nezačínej, ať se ti to neplete a rovnou to dělej v PHP5.

PHP umožňuje použití nedeklarovaných proměnných, byl tak navržen. Deklarace vyjadřuje hlavně způsob, jak bude proměnná viditelná, příp. jestli bude dynamická či statická.

$this-> vyjadřuje odkaz na proměnnou, která je součástí objektu. Parametry metod tak mohou mít stejné názvy a nepoplete se to.

A vůbec:
http://php.net/manual/en/language.oop5.php
Najdeš tam hromadu příkladů.
Viditelnost určuje to, jak již název napovídá, jak se proměnná/funkce bude chovat. Jsou tři typy:

public - veřejný a nemusí být uváděn. Tato proměnná/funkce bude všude vidět a není nijak omezena. Tento modifikátor se dá vlastně porovnat s tím, co dosud používáš a v PHP4 je u proměnné definován jako var.

private - soukromý. Tento modifikátor kompletně skryje proměnu/funkci před vnějškem. Používá se pouze uvnitř třídy. Z venku není vidět a tudíž i použitelný. Využije se tehdy, pokud potřebuješ definovat proměnu, která se použije jen vnitřně a bude se přenášet mezi funkcemi.

protected - tento modifikátor je zvláštní případ private. Má stejné vlastnosti jako private, ale na rozdíl od něj umožňuje proměnu/funkci použít i na zděděnou třídu.

$this - je zvláštní objekt, který odkazuje na sebe sama. Takže tím můžeš přistupovat k jiným metodám, či k jiné proměnné v téže třídě. Používá se pouze vnitřně.

Deklarování proměnné vně třídy $trida->promenna = 1; způsobí, že tuto nedefinovanou proměnu připojí do třídy. Ta se pak prezentuje jako public a lze k ni přistupovat jak vně, tak i uvnitř. Ovšem vně nelze deklarovat proměnu, která je ve třídě jako private. To pak zahlásí chybu Cannot access private property.
Tento způsob deklarování je takový zvláštní a třeba vzít v potaz, co s takovou proměnnou chceš dělat. Obecně je třeba brát v úvahu, že když definuješ proměnu vně třídy, pak je lepší tak s ní i zacházet. Tedy přistupovat k proměnné pouze vně. Pokud chceš takovou proměnu použít i uvnitř třídy, pak už je lepší ji předem ve třídě deklarovat. Vyhneš se tak nečekaným komplikacím.
Vytvoril som svoju prvú triedu, a chcel by som poznať váš názor na efektivitu písania kódu, prípadne bezpečnosť, alebo čo by ste napísali ináč (môžu byť aj úplné maličkosti a pripomienky, čo sa týka štábnej kultúry). V posledných dvoch riadkoch je aj vyvolanie inštancie triedy, teda súbor neobsahuje len samotnú definíciu

-- login.php

<?php

class cLogin {

public function __construct($host,$user,$db) {

session_start();

$this->link=MySQL_Connect($host,$user);

if ($this->link) {

$this->db=$db;
MySQL_Select_DB($this->db);

}

}

public function __destruct() {

MySQL_Close($this->link);

}

public function login() {

$sel=mysql_query("SELECT * FROM users WHERE user = '".mysql_real_escape_string($_GET["user"])."' AND pass = SHA1(CONCAT('" . mysql_real_escape_string($_GET["pass"]) . "', salt))");

if ($sel) {

while ($num=MySQL_Fetch_Array($sel)) {

//echo "Prihlásený užívateľ: <b>".$num["user"]."</b>";
$_SESSION["user"]=$num["user"];

}

}



}

}

$inst = new cLogin("localhost","root","s");
$inst->login();

?>
Mám ešte raz otázku ohľadom viditeľnosti členských premenných:

<?php

class cTrieda {

public $premenna;

function spracuj () {

$premenna=2*10;
return $premenna;

}

}

$inst=new cTrieda();
echo $inst->spracuj()->premenna;

?>

Nepodarilo sa mi dostať obsah premennej po spracovaní v metóde spracuj() pre použitie mimo triedu. Existuje na to nejaký spôsob, alebo sa len ako štrukturovane mysliaci človek márne snažím spraviť čosi čo odporuje zásadam OOP?
Mno. Je tam několik nedostatku, kterých by ses měl vyvarovat.

Tak v prvé řadě jde o proměnné. Pokud uvnitř třídy používáš třídní proměnu (používáš v několika metodách), tak je lepší ji předem definovat. Pokud ji používáš pouze ve třídě, pak je lepší, aby nebyla z venku vidět. To jest definovat proměnu jako private.

class cLogin {

private $db;
private $link;

public function ...


}

Další věc. Parametry metod. Pamatuj si, že třídy jsou od toho, aby se daly snadno a kdekoli použít. Takže je dobré si pamatovat, jaké parametry je vhodné předávat. U třídy je vhodné používat neutrální metody, které nebudou vadit jak třídě, tak i aplikaci.
V případě __construct(), a podstatě v tomto případě jako prostředek pro práci s databázi, by bylo na pováženou, zda je skutečně potřeba předávat hodnoty. Zda by nebylo lepší tyto hodnoty použít vnitřně. To jest, uvnitř __construct() zavolat nastavení DB ze souboru a nastavit je.
V druhém případě metoda login(). Zda by nebylo lepší tam parametry přidat - login($user, $pass). Zajistíš si tak trochu univerzálnost. Co když se pak rozhodneš, že nebudeš používat $_GET (což je absolutní blbost předávat heslo přes url) nebo potřebuješ přístupové údaje ještě předtím zpracovat?
Prostě při návrhu si promyslet zda je vhodné parametry použít nebo ne.

Další užitečná poznámka. Vyvaruj se uvnitř třídy používat vnější věci.
Což v tomto případě jsou session_start() a superglobální proměnné $_GET, $_POST, $_SESSION (i když zde se session v rozumné míře může použít).
Aplikace neví, co je uvnitř třídy a třída neví, co se děje venku. Tak není rozumné to komplikovat.

A v tomto díle poslední rada :) Všechny metody by měly mít svou návratovou hodnotu (return). Pokud nevrací žádnou hodnotu, pak stačí obyčejné return true.
Podstatě je to takto. Parametry metod jsou vstupní bránou do objektu a návratová hodnota je pak výstup z objektu.

$vystup = $Objekt->metoda($vstup);

public function metoda($vstup)
{
// zde mohu jakkoli pracovat s parametrem $vstup
$vystup = $vstup;
// a výsledkem je výstup něčeho vypracovaného
return $vystup;
}

Takže tvůj druhý příklad je chybný. Tam stačí pouze echo $inst->spracuj(); protože jsi $premenna předal do return a ta se pak echem vypíše.
To cos myslel, je možná tento případ:

<?php

class cTrieda {

public $premenna;

function spracuj () {

$this->premenna = 2*10;

}

}

$inst=new cTrieda();
$inst->spracuj();
echo $inst->premenna;

?>
Ďakujem za vyčerpávajúcu odpoveď. Definovať teda viditeľnosť každej jednej vnútrotriednej premennej vrátane tzv. pomocných premenných (napríklad aj premennú s identifikátorom MySQL spojenia)? V prípade použitia v triede, napríklad počítadla $i++, definovať aj viditeľnosť takéhoto typu premenných?
Triedu, ktorú postupne rozširujem o ďalšie metódy som plánoval napísať tak, že oddelím vizuálnu časť kódu od funkčného, teda v triede nie je kód samotného prihlasovacieho formulára. Preto som použil superglobálne premenné (úplne najnesprávnejšiu možnosť $_GET z dôvodu, že som nevedel napísať AJAXové volanie s prenosom POST premenných, zmieňujem to v poslednom príspevku v inom vlákne diskusie http://www.webzdarma.cz/forum/read.php?f=2&i=45409&t=45409 ). Samozrejme založenie a zánik MySQL spojenia v triede sa dá realizovať vnútri, ale ak by som chcel zachovať oddelenie funkčnosti a vizuálnu časť, akú mám možnosť okrem $_SESSION premennej ($_GET uznávam, je najnesprávnejšia možnosť) ? Metódy tejto triedy sú volané AJAXom prostredníctvom udalosti onClick tlačidla button (teda nie klasický submit) formulára.
Jak již název metod napovídá:
- metoda GET je určena pro získávání dat ze serveru
- metoda POST je určena k odesílání dat na server

Možná jsem trochu mimo, ale od doby, co jsem poznal jQuery, nepokouším se dělat AJAX jiným způsobem. Tam funguje i zmíněný POST.