Jump to content
php.lv forumi

PHP klases vērtību aizsardzība


ArnisR

Recommended Posts

Tātad ir klase:

 

class manaKlase
{
  public $data;

  public function __construct(){

   ...

  $statement = $pdo->prepare("SELECT * FROM `table`");
  $statement->execute();
  $this->data = ($statement->rowCount() != 0) ? $statement->fetchAll(PDO::FETCH_ASSOC) : null;

  }

}

$manaKlase = new manaKlase();

 

Izveidojot objektu, ir pieejams publisks masīvs $manaKlase->data, kas satur no datubāzes atlasītos datus! Vai ir iespējams paveikt tā, lai no šī masīva varētu nolasīt vērtības, taču nebūtu iespējams tās mainīt ārpus klases, piemēram:

 

// Nolasām
echo $manaKlase->data[0]["field"];

// Nenostrādā
$manaKlase->data[0]["field"] = "cita vērtība";

 

Paldies!

Edited by ArnisR
Link to comment
Share on other sites

Idejiski var, praksē varētu būt pagrūti :) bet meklē ORM virzienā, faktiski uzliekot visas entīttijas vērtības kā private un pēc tam katrai vajadzīgai uztaisot get metodes.

Link to comment
Share on other sites

Var uzlikt klasei getteri ar __get, tad var vērtību nolasīt, bet nevar izmainīt.

http://codepad.org/K5EePEAv


class Test{
 private $data;
 function init(){
   $this->data['a']=5;
 }
 function __get($k){
   if ($k=='data') return $this->data;
 }
 function changeFromInside(){
   $this->data['a']=6;
 }

}

$test = new Test();
$test->init();
var_dump($test);
var_dump($test->data['a']);
$test->changeFromInside();
var_dump($test);
$test->data['a']=7;
var_dump($test);

Edited by codez
Link to comment
Share on other sites

/* public, jo atgriezh kopiju - klases dati netiek samaitaati */
public function getRow($number)
{
return isset($this->data[$number]) ? $this->data[$number] : null;
}

public function getCellValue($rowNumber, $column)
{
/* parbaudam vai parametri valiidi, jo php nav strong typed */

if ($row = $this->getRow($rowNumber)) {
return isset($row[$column]) ? $row[$column] : null;
}

return null;
}

Vajadzētu ņem vērā lietas:

 

* __get() metode jās prātu - prasīsi it kā neesošus klases propertijus, bet reāli nezini, kas notiks, ja uzsetosi, ja nav iekš __set() atrunāts, arī autocomplete neredzēs.

* visu to selekta rezultātu kopēt (return $this->data) nav prāta darbs, jo masīvi masīvi aizkakā atmiņu - tukšs elements jau 144 baiti. Attēlošanai vēlams uz templeitu padot pašu resultu un tad pa šamo iterēties. ColdFusionā šī lieta eleganti notiek, piemēram.

* Ja nedari šo paša izglītošanās pēc vai negribi čakarēties, paņem ActiveRecord un miers mājās - kodēsies ātri, strādās lēni un netīri, bet gana labi tipveida lapām vai intranetiem.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...