Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pierwsze kroki w OOP
Forum PHP.pl > Forum > PHP > Object-oriented programming
Grzesiek23
Witam!

Postanowiłem przepisać jeden projekt napisany w C# do PHP.

Mam taką oto klasę:

  1. public partial class UserPageBase
  2. {
  3. /// <summary>
  4. /// The _init user page.
  5. /// </summary>
  6. private bool _initUserPage = false;
  7.  
  8. /// <summary>
  9. /// The _page.
  10. /// </summary>
  11. private DataRow _page = null;
  12.  
  13. /// <summary>
  14. /// The _user flags.
  15. /// </summary>
  16. private UserFlags _userFlags = null;
  17.  
  18. /// <summary>
  19. /// Gets or sets Page.
  20. /// </summary>
  21. public virtual DataRow Page
  22. {
  23. get
  24. {
  25. if (!this._initUserPage)
  26. {
  27. InitUserAndPage();
  28. }
  29.  
  30. return this._page;
  31. }
  32.  
  33. set
  34. {
  35. this._page = value;
  36. this._initUserPage = value != null;
  37.  
  38. // get user flags
  39. if (this._page != null)
  40. {
  41. this._userFlags = new UserFlags(this._page["UserFlags"]);
  42. }
  43. else
  44. {
  45. this._userFlags = null;
  46. }
  47. }
  48. }
  49.  
  50. /// <summary>
  51. /// Helper function to see if the Page variable is populated
  52. /// </summary>
  53. /// <returns>
  54. /// The page is null.
  55. /// </returns>
  56. public bool PageIsNull()
  57. {
  58. return Page == null;
  59. }
  60.  
  61. /// <summary>
  62. /// Helper function used for redundant "access" fields internally
  63. /// </summary>
  64. /// <param name="field">
  65. /// </param>
  66. /// <returns>
  67. /// The access not null.
  68. /// </returns>
  69. private bool AccessNotNull(string field)
  70. {
  71. if (Page[field] == DBNull.Value)
  72. {
  73. return false;
  74. }
  75.  
  76. return Convert.ToInt32(Page[field]) > 0;
  77. }
  78.  
  79. /// <summary>
  80. /// Internal helper function used for redundant page variable access (bool)
  81. /// </summary>
  82. /// <param name="field">
  83. /// </param>
  84. /// <returns>
  85. /// The page value as bool.
  86. /// </returns>
  87. private bool PageValueAsBool(string field)
  88. {
  89. if (Page != null && Page[field] != DBNull.Value)
  90. {
  91. return Convert.ToInt32(Page[field]) != 0;
  92. }
  93.  
  94. return false;
  95. }
  96.  
  97. /// <summary>
  98. /// Internal helper function used for redundant page variable access (int)
  99. /// </summary>
  100. /// <param name="field">
  101. /// </param>
  102. /// <returns>
  103. /// The page value as int.
  104. /// </returns>
  105. private int PageValueAsInt(string field)
  106. {
  107. if (Page != null && Page[field] != DBNull.Value)
  108. {
  109. return Convert.ToInt32(Page[field]);
  110. }
  111.  
  112. return 0;
  113. }
  114.  
  115. /// <summary>
  116. /// Internal helper function used for redundant page variable access (string)
  117. /// </summary>
  118. /// <param name="field">
  119. /// </param>
  120. /// <returns>
  121. /// The page value as string.
  122. /// </returns>
  123. private string PageValueAsString(string field)
  124. {
  125. if (Page != null && Page[field] != DBNull.Value)
  126. {
  127. return Page[field].ToString();
  128. }
  129.  
  130. return string.Empty;
  131. }
  132.  
  133. }
  134.  


DataRow to wiersz tablicy.

Trochę czytałem (uczę się dopiero OOP). Wyczytałem, iż standardowe metody __get i __set działają trochę inaczej niż w przypadku C#.

W sumie to z grubsza chodzi mi o przykładowy kod, który byłby analogiczny do tego w C# powyżej (w php oczywiście).

Nie mam pomysłu jak zaimplementować ten wiersz tablicy.

Dziękuję.
Crozin
1. PHP nie wspiera partial classes - będziesz musiał złączyć wszystko w jeden plik.
2. PHP nie wspiera modyfikatorów dostępu dla klas - wszystkie są niejako publiczne.
3. W PHP wszystkie niefinalne metody są wirtualne.
4. PHP nie wspiera "właściwości" (get/set). __get() / __set() nie mają z tym za wiele wspólnego. Musisz utworzyć "klasyczne" gettery i settery.
Noidea
1. W PHP nie ma partial - klasę zapisz jako całosć
2. Właściwości przerób na settery/gettery żeby zachować zgodność z konwencją w PHP
3. Wszystkie metody są domyślnie wirtualne
4. http://en.wikipedia.org/wiki/PHPDoc
5. Stosowanie $this przy dostępie do elementów obiektu jest wymagane


[EDIT]
Spóźniłem się, ale 4 i 5 może się przydać, więc nie usuwam posta.
Grzesiek23
Dzięki Panowie smile.gif
Rozjaśniliście mi trochę temat tongue.gif Jestem dopiero szaraczkiem, który wpływa na głębokie wody w PHP wink.gif

Odnośnie tych właściwości (gwoli ścisłości) na przykładzie wiersza Page, powinienem napisać getPage i setPage, tak?
Crozin
Cytat
Odnośnie tych właściwości (gwoli ścisłości) na przykładzie wiersza Page, powinienem napisać getPage i setPage, tak?
Dokładnie tak.
Grzesiek23
A mam takie pytanie.

Przeglądałem kilka skryptów i zastanawia mnie różnica między "->" a "::". Gdzieś przeczytałem, iż "::" stosuje się przy statycznych klasach, ale skrypty, które widziałem nie były zadeklarowane jako statyczne.

Czym się różni "->" a "::". Kombinowałem trochę, ale jakoś nie mogę tego pojąć.

Zauważyłem też, iż jeśli odwołam się od jakiejś funkcji klasy przez "::" to wywala błąd jeśli w funkcji używam odwołania do jej wnętrza "$this->..."
mat-bi
:: - odwolanie do stattycznej funkcji klasy, tzn. takiej, którą można wykonać bez konstruowania klasy

-> odwołanie do zwykłej funkcji(statycznej też), często ze zmiennej, np. $this, albo ze zmiennej, która jest obiektem danej klasy

@EDIT:

Właśnie chodzi o to, że jeśli zadeklarujesz funkcję statyczna, nie możesz się odwoływać do innych funkcji klasy przez $this
Speedy
Nikt tu nie wspomniał też o tym, że w PHP nie deklarujesz typów danych (zwracana wartość funkcji oraz zmienne). Możesz te dane jedynie później rzutować, aby wymusić konkretny typ.
sarxos
To nie do końca prawda, możesz specyfikować typ danych w definicji metod:

  1. class A {
  2. public function count(ArrayObject $a) {
  3. // ...
  4. }
  5. }

We wnętrzu metod statycznych nie możesz uzywać $this, ponieważ referencja ta wskazuje na obiekt, który w przypadku boków statycznych nie istnieje. Odpowiednikiem dla referencji na klasę jest self, np:

  1. class A {
  2.  
  3. private $test = "Test";
  4. private static $test_static = "Static test";
  5.  
  6. public function getTest() {
  7. return $this->test;
  8. }
  9.  
  10. public static getTestStatic() {
  11. return self::$test_static;
  12. }
  13. }

Natomiast wywołania tych metod:

  1. print(A::getTestStatic()); // "Static test"
  2.  
  3. $a = new A();
  4. print($a->getTest()); // "Test"
drPayton
Cytat(sarxos @ 15.06.2011, 15:56:08 ) *
To nie do końca prawda, możesz specyfikować typ danych w definicji metod:
(...)

To też nie do końca prawda - tylko obiekty (/interfejsy, i siłą rzeczy - tablice)

PS. Czemu Ty @sarxos bawisz się w archeologię? Masz zamiar docelowo wypowiedzić się w każdym temacie w tym dziale, niezależnie od daty jego utworzenia (czy raczej daty ostatniego postu)? ;>
Speedy
Cytat(sarxos @ 15.06.2011, 15:56:08 ) *
To nie do końca prawda, możesz specyfikować typ danych w definicji metod:

  1. class A {
  2. public function count(ArrayObject $a) {
  3. // ...
  4. }
  5. }


To, co napisałem wcześniej jest prawdą. Oczywiście, że można podać typ, ale robi się to rzadko i w konkretnych przypadkach. PHP ma dynamiczne typowanie i nie trzeba deklarować typów (ale można, jeśli ktoś bardzo chce, lecz tylko w niektórych miejscach i tylko wybrane typy, które zostały już wymienione - resztę można jedynie rzutować).
Daiquiri
A ja myślę, że autor znalazł odpowiedź na swoje pytanie 2 miesiące temu smile.gif. Sarxos, nie odkopujmy tematów tylko po to, żeby polemizować.
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.