Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zasięg zmiennych w klasie w dziedziczeniu
Forum PHP.pl > Forum > PHP
kabanek
witam,

mam taką oto klasę:

  1. <?php
  2.  
  3. namespace Cms\Entity;
  4.  
  5. /**
  6.  * Klasa reprezentująca użytkownika
  7.  * @Table(name="users")
  8.  * @Entity
  9.  */
  10.  
  11. class User extends \Cms\Model\Base
  12. {
  13. /**
  14.   * Identyfikator użytkownika
  15.   * @var integer $id
  16.   * @Column(name="id", type="integer", nullable="false")
  17.   * @Id
  18.   * @GeneratedValue(strategy="IDENTITY")
  19.   */
  20. private $id;
  21.  
  22. /**
  23.   * Imię użytkownika
  24.   * @Column(type="string", length=64, nullable="true")
  25.   * @var string
  26.   */
  27. private $firstname;
  28.  
  29. /**
  30.   * Nazwisko użytkownika
  31.   * @Column(type="string", length=64, nullable="true")
  32.   * @var string
  33.   */
  34. private $lastname;
  35. }


ona dziedziczy po tej klasie:

  1. <?php
  2.  
  3. namespace Cms\Model;
  4.  
  5. /**
  6.  * Klasa bazowa dla wszystkich modeli, ktore są odzwierciedleniem tabeli w
  7.  * bazie danych
  8.  */
  9. class Base {
  10.  
  11. /**
  12.   * Zwraca nazwę metody 'seter'a używając konwensji camelCase
  13.   * Dla przykładu dla zmiennej o wartości 'name' zwróci: setName
  14.   * @param string $variable
  15.   * @return string
  16.   * @author Bartłomiej Kiełbasa <bartlomiej.kielbasa@gmail.com>
  17.   */
  18. protected function getSeterName($variable) {
  19. return 'set' . \Cms\Text::toCamelCase($variable);
  20. }
  21.  
  22. /**
  23.   * Zwraca nazwę metody 'geter'a używając konwensji camelCase
  24.   * Dla przykładu dla zmiennej o wartości 'name' zwróci: getName
  25.   * @param string $variable
  26.   * @return string
  27.   */
  28. protected function getGeterName($variable) {
  29. return 'set' . \Cms\Text::toCamelCase($variable);
  30. }
  31.  
  32. /**
  33.   * Metoda wywoływana, gdy zostanie wywołana metoda, która nie jest zefiniowana w klasie.
  34.   * Wykorzystuję ją, aby stworzyć metody w stylu setName setId getId itp dynamicznie
  35.   * @param string $name
  36.   * @param array $arguments
  37.   * @throws \Cms\Exception
  38.   */
  39. public function __call($name, array $arguments = array()) {
  40.  
  41. if (substr($name, 0, 3) == 'set') {
  42. $variable = \Cms\Text::fromCamelCase(substr($name, 3));
  43.  
  44. if (isset($this->$variable) && isset($arguments[0])) {
  45. $this->$variable = $arguments[0];
  46. return;
  47. }
  48. }
  49.  
  50. if (substr($name, 0, 3) == 'get') {
  51. $variable = \Cms\Text::fromCamelCase(substr($name, 3));
  52.  
  53. if (isset($this->$variable)) {
  54. return $this->$variable;
  55. }
  56. }
  57.  
  58. throw new \Cms\Exception("Method '$name' not found");
  59. }
  60. }



Wizja tego co napisałem wygląda następująco:

W klasie User tworzę zmienne prywatne. W klasie Base tworzę metody, która sprawdzi, czy dana zmienna istnieje w klasie User i jeśli tak, to pozwoli wykonać metody w stylu setId oraz getId. Klas w stylu User będę miał naprawdę wiele, dlatego wolałbym uniknąć zbędnego kopiowania kodu. Metoda \Cms\Text::fromCamelCase przetwarza tekst na teksty wTymStylu smile.gif
Crozin
Nie widzę pytania?

Jednak sam pomysł jest z definicji zły. Wygenerowanie getterów / setterów to trzy kliknięcia myszką w pierwszym lepszym IDE (RMB -> Source -> Generate Getters and Setters), a masz ładny, klarowny i łatwy w utrzymaniu kod.
kabanek
no wiem, tylko zastanawiałem się, czy można w ten sposób to zautomatyzować
Crozin
Można, ale generalnie jest to paskudna praktyka. Co więcej w ostateczności prowadzi jedynie do większej ilości problemów nie rozwiązując przy tym żadnych realnych niedogodności.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.