Zakupiłem książkę PHP i MySQL. Projekty do wykorzystania:
http://helion.pl/ksiazki/php-i-mysql-proje...inas,phmspr.htm
Znajduje się w niej kod odpowiadający za mechanizm rejestracji i logowania użytkowników, który w kolejnych rozdziałach jest bazą do tworzenia różnych przykładowych aplikacji. Jego zasadnicza częścią jest klasa User, której kod przedstawiam poniżej:
<?php class User { private $uid; // identyfikator użytkownika private $fields; // inne pola rekordu // inicjalizacja obiektu User public function __construct() { $this->uid = null; 'password' => '', 'emailAddr' => '', 'isActive' => false); } // nadpisanie metody odczytującej właściwości public function __get($field) { if ($field == 'userId') { return $this->uid; } else { return $this->fields[$field]; } } // nadpisanie metody ustawiającej właściwości public function __set($field, $value) { { $this->fields[$field] = $value; } } // sprawdzenie, czy nazwa użytkownika ma właściwy format { } // sprawdzenie, czy adres email ma właściwy format { return filter_var($email, FILTER_VALIDATE_EMAIL); } // zwrócenie obiektu wypełnionego na podstawie identyfikatora użytkownika { $u = new User(); 'FROM %sUSER WHERE USER_ID = %d', DB_TBL_PREFIX, $uid); { $u->username = $row['USERNAME']; $u->password = $row['PASSWORD']; $u->emailAddr = $row['EMAIL_ADDR']; $u->isActive = $row['IS_ACTIVE']; $u->uid = $uid; } return $u; } // zwrócenie obiektu wypełnionego na podstawie nazwy użytkownika { $u = new User(); 'FROM %sUSER WHERE USERNAME = "%s"', DB_TBL_PREFIX, { $u->username = $username; $u->password = $row['PASSWORD']; $u->emailAddr = $row['EMAIL_ADDR']; $u->isActive = $row['IS_ACTIVE']; $u->uid = $row['USER_ID']; } return $u; } // zapisanie rekordu w bazie danych public function save() { if ($this->uid) { 'PASSWORD = "%s", EMAIL_ADDR = "%s", IS_ACTIVE = %d ' . 'WHERE USER_ID = %d', DB_TBL_PREFIX, $this->isActive, $this->userId); } else { 'EMAIL_ADDR, IS_ACTIVE) VALUES ("%s", "%s", "%s", %d)', DB_TBL_PREFIX, $this->isActive); } } // oznaczenie rekordu jako nieaktywnego i zwrócenie znacznika aktywacji public function setInactive() { $this->isActive = false; $this->save(); // zapewnienie, że rekord jest zapisany $token = random_text(5); 'VALUES (%d, "%s")', DB_TBL_PREFIX, $this->uid, $token); return $token; } // wyczyszczenie tymczasowego statusu użytkownika i oznaczenie rekordu jako aktywnego public function setActive($token) { 'AND TOKEN = "%s"', DB_TBL_PREFIX, $this->uid, { return false; } else { 'AND TOKEN = "%s"', DB_TBL_PREFIX, $this->uid, $this->isActive = true; $this->save(); return true; } } } ?>
Zdeklarowana w klasie metoda dostępowa __SET:
Kod
public function __set($field, $value)
{
if (array_key_exists($field, $this->fields))
{
$this->fields[$field] = $value;
}
}
przewiduje jedynie zapis do pola fields, które za sprawą konstruktora rozbudowywane jest do rozmiarów tablicy. Jak zatem możliwy jest zapis do pola $uid występujący np. w metodzie public static function getById($uid)?
Czy ktoś mógłby to wyjaśnić?
Wiem, że mógłbym uniknąć całego problemu zmieniając pola z private na public lub deklarując w __SET obsługę także pola $uid ale mnie interesuje zrozumiane tego jak to się dzieje, że zapis do pola $uid jest w ogóle możliwy mimo braku obsługi tegoż pola w metodzie __SET.
Za pomoc z góry dziękuję.
Cały rozdział(1) w którym umieszczona została przytoczona powyżej klasa jest dostępny na stronie:
http://pdf.helion.pl/phmspr/phmspr-1.pdf
Dostępny jest także kod z tego rozdziału:
ftp://ftp.helion.pl/przyklady/phmspr.zip