Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [skrypt] "framework" OpenWikiBlog, Wolne oprogramowanie
Babcia@Stefa
post 1.09.2010, 12:50:34
Post #1





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Witam, ostatnio na własne potrzeby zacząłem pisać coś w czym będę się czuć swobodnie pisząc kolejne aplikacje internetowe, to tak zwany "szkielet".

Uwaga, uwaga, w celu rozwiania pewnych uwag i wątpliwości pojęcie framework zostało objęte cudzysłowiem ponieważ jest to framework po mojemu, jeżeli komuś się nie podoba to nie musi używać i nie, nie będę patrzeć na Zend Framework czy inne frameworki - ten jest inny!

Jednak jestem zwolennikiem Wolnego i Otwartego Oprogramowania dlatego postanowiłem, że podzielę się Swoją pracą z innymi ludźmi.

Hosting projektu zapewnia github.com, niestety muszę przyznać, że to mój pierwszy projekt hostowany na GIT i mam nadzieję, że nic nie zepsuje po drodzę ( jestem ostrożny ) smile.gif

=== TU TNIJ ===

Przejdę do rzeczy, konkrety, konkrety!

No i oczywiście dodam link do repozytorium projektu:
http://github.com/webnull/OpenWikiBlog

Jądro


Całość jest zbudowana w oparciu o jądro, a reszta to tylko moduły.

Jądro może nie waży zbyt wiele, ale jest na prawdę funkcjonalne.

Cechy jądra:
  • Budowa jądra zakłada maksymalnie łatwą dla dewelopera obsługę modułów
  • Obsługa "domyślnych modułów" - muszą mieć zaimplementowany uniwersalny interfejs
  • "Module On Demand" - Pierwsza cecha również tyczy się zależności, moduły ładowane są wtedy kiedy potrzeba ( same się załadują - to poprawia wydajność )
  • Tak zwany skrypt startowy, są w nim moduły które startują razem z skryptem domyślnie
  • "CallThroughtKernel" - pozwala w skryptach startowych zamiast modułu podać tylko jego wewnętrzną funkcję aby wywołać ją później
  • "Kernel Module Triggers" - czyli odpowiednie reguły które jeżeli się zgadzają to moduł zostanie załadowany ( uproszczona budowa zapewnia szybkość wykonywania kodu )


"Module On Demand"

Wystarczy odwołać się do modułu który nie został załadowany aby został załadowany smile.gif

Kod
$Kernel -> module -> moduleFunction ( Arguments );


Powyższy przykład w razie gdy moduł "module" nie istnieje załaduje moduł oraz odwoła się do jego funkcji o zwróci porządaną wartość.

Skrypty startowe

  1. $MODS['admin'] = array ( 'k_TRIGGERS' => array (array(1=>$_GET['page'], 2=>9))); // jeżeli $_GET['page'] == 9 to moduł zostanie załadowany
  2. $MODS['hooks'] = NuLL; // normalnie ładuje moduł
  3. $MODS['smarty'] = array ( 'caching' => false,
  4. 'cache_lifetime' => 120,
  5. 'template_dir' => 'websites/cube/templates',
  6. 'compile_dir' => 'websites/cube/templates_c',
  7. 'config_dir' => 'websites/cube/core',
  8. 'cache_dir' => 'websites/cube/cache' ); // ładuje moduł smarty z odpowiednimi argumentami
  9. $MODS['translator'] = array ( 'default_language' => 'english' ); // ładuje moduł translator z argumentami
  10. $MODS['mypage'] = array ( 'index' => 1 ); // ładuje mypage ze wskazaniem która strona to strona główna
  11. $MODS['menu'] = NuLL; // ładuje menu
  12. $MODS[] = array ( 'mypage', 'display', ''); // odwołuje się do modułu mypage i wykonuje display() z argumentem '' - inaczej CallThroughtKernel


Odnośnie skryptów startowych, na wiki jeszcze niema nic opisane ale obiecuję, że wkrótce opiszę każdy szczegół konfiguracji razem z "kolorowymi" przykładami ( gotowcami ) w miarę prosto i zwięźle.

Obsługa domyślnych modułów

Moduł może zdefiniować Siebie jako domyślny do wykonywania danej czynności, np. moduł MojErrorHandler może wywołać $Kernel->setAsDefault('MojErrorHandler', 'error_handler' );

Po zdefiniowaniu domyślnego modułu np. Error Handlera inne moduły będą go używać w taki sposób:

Kod
$Kernel->error_handler->log('asd');


"hooking" ( zaczep ) - czyli jak zmodyfikować prywatną zmienną wewnątrz funkcji innej klasy


Od niedawna ( dwa ostatnie commity ) dodałem moduł libhooks ( nazwa wywoławcza: hooks ).

Moduł pozwala zmodyfikować prywatną zmienną wewnątrz funkcji innego modułu jeżeli ten moduł na to pozwoli.

Jak to działa w praktyce?

Moduł który chce zmodyfikować dane innego modułu musi być załadowany najpierw.
Definiujemy zaczep o nazwie np. "moj_zaczep" podając dodatkowo nazwę klasy i funkcji która ma być wywołana do zmodyfikowania danych przekazanych z zaczepu.
Definicji dokonujemy w module który startuje najpierw.

Teraz startujemy moduł który posiada dane do zmodyfikowania przez inny moduł, wykonujemy zaczep wrzucając do niego dane które przejmie drugi moduł i zwróci "w poprawionej wersji".

Teraz prosty przykład:
  1. modul_pierwszy {
  2. konstruktor_lub_dowolna_funkcja { // najlepiej konstruktor
  3. definiuj_zaczep ( 'liczba', 'modul_pierwszy', 'edytor_zaczepu' );
  4. }
  5.  
  6. edytor_zaczepu ( $dane ) {
  7. return ($dane+1);
  8. }
  9. }


  1. modul_drugi {
  2. konstruktor_lub_dowolna_funkcja {
  3. $moja_liczba = 500;
  4. echo $moja_liczba; // pokaże 500
  5. wykonaj_zaczep ( 'liczba', $moja_liczba );
  6. echo $moja_liczba; // pokaże 501 ponieważ zaczep wykona funkcję modul_pierwszy->edytor_zaczepu($dane) i ustawi zwrócone dane funkcji w zmiennej $moja_liczba
  7. }
  8. }


Jak powstają nowe funkcje oraz moduły Kernela?


Oczywiście buduję własne strony na tym frameworku i jeżeli coś stoi na drodze to poprawiam to lub dodaję nową funkcjonalność i publikuję na bieżąco na githubie.

Zawsze jednak jeżeli jesteś chętny/chętna do współpracy to na prawdę zapraszam, z chęcią przejrzę każdą poprawkę i dodam do projektu.

Niestety nie posiadam teraz żadnego zewnętrznego hostingu, dlatego strona testowa ( mój warsztat ) nie zawsze jest dostępny, ale wtedy kiedy będzie to zapraszam: http://194.29.181.186/tuxplace-cube/

To jedna ze stron która działa na frameworku.

Zapraszam do ocen, oraz do pomocy przy pisaniu kodu (wnoszeniu poprawek jak i funkcjonalności nowej) smile.gif

PS. OpenWikiBlog dlatego, że projekt miał być małym mechanizmem podobnym do bloga - jedynie tworzenie i edytowanie podstron HTML razem z panelem administracyjnym ale się rozrosło smile.gif

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 13:31:44


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
SHiP
post 1.09.2010, 14:21:35
Post #2





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Nie przeglądałem dokładnie ale jak wrócę z pracy to zobaczę. Moje uwagi po 5 sekundach patrzenia w kod:

1. Dziwny sposób komentowania kodu. Dla mnie czytelniejszy nic JavaDoc/Doxygen etc ale inni pewnie cię wybluzgają za to =). Swoją drogą dlaczego # a nie // questionmark.gif
2. Nazewnictwo. Chyba programowałeś w C zanim siadłeś do php winksmiley.jpg. Ja jestem przyzwyczajony do innej notacji ale cóż, to już Twój wybór

3.
core/kernel.so.php
  1. public function ReturnSelfDumped()
  2. {
  3. return array ( 'private:apps' => $this->$Apps, 'protected:Version' => $this->Version, 'private:Mods' => $this->Mods);
  4. }


Powinno być $this->Apps


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Spawnm
post 1.09.2010, 14:37:04
Post #3





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




czemu w index.php masz session_start() ?

query() i dquery ( $Query ) w db a opisu brak , dokumentacji chyba też.
Masz sporo kodu w komentarzach , czemu?
Po co wciskasz smarty w lib?
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 14:51:12
Post #4





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Cytat(Spawnm @ 1.09.2010, 14:37:04 ) *
czemu w index.php masz session_start() ?

query() i dquery ( $Query ) w db a opisu brak , dokumentacji chyba też.
Masz sporo kodu w komentarzach , czemu?
Po co wciskasz smarty w lib?


Cytat(Spawnm)
Po co wciskasz smarty w lib?


Ponieważ tworzę uniwersalny interfejs dla systemu szablonów, tak aby w przyszłości dało się uwolnić od smarty i bezboleśnie przejść na inny system szablonów bez poprawy kodu PHP.

Cytat(Spawnm)
query() i dquery ( $Query ) w db a opisu brak , dokumentacji chyba też.


Dokumentacja do bazy danych jest jeszcze nie gotowa, opublikuję ją na wiki jak tylko skończę.

Cytat(Spawnm)
Masz sporo kodu w komentarzach , czemu?


Ostatnio zabrałem się trochę za optymalizację kodu, stąd kod w komentarzach - jakoś nie mam zwyczaju przy optymalizacji całkowicie kasować kodu szczególnie w publicznym projekcie.

Cytat(Spawnm)
czemu w index.php masz session_start() ?


Nie mam pojęcia czy to złe rozwiązanie i dlaczego, ale po prostu rozpoczynam sesję w index.php ponieważ w frameworku zawsze index.php jest wykonywany bo to ten "główny plik" który uruchamia całą machinę.

Po prostu jeżeli istnieje powód dlaczego session_start() nie może być w index.php to słucham i oczywiście poprawię.

Dziękuję za zainteresowanie.

PS. dquery() prawdopodobnie zniknie zaraz - utworzyłem tą funkcję w celach debugowania ponieważ PHP nie wyświetlało Mi błędów, to długa historia w jakich okolicznościach stworzyłem tą funkcję.
Całkowicie o niej zapomniałem...

@edit

Cytat(SHiP)
Powinno być $this->Apps


Dzięki wielkie!

"co kilka par oczu to nie jedna" smile.gif

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 15:06:29


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
Zyx
post 1.09.2010, 15:18:26
Post #5





Grupa: Zarejestrowani
Postów: 952
Pomógł: 154
Dołączył: 20.01.2007
Skąd: /dev/oracle

Ostrzeżenie: (0%)
-----


Uwagi na szybko:

1. Jaki jest sens używania niestandardowego nazewnictwa, kiedy jest to wręcz wzorcowy sposób na uniemożliwienie ludziom normalnej pracy ze skryptem i integrowania go z takimi narzędziami, jakich potrzebują? Przeczytaj PSR-0 proposal i zacznij klepanie od nowa, jako weteran open-source wiem, co mówię smile.gif.

2.

Kod
public function __construct ( &$CFG, &$MODS, &$HTML, &$DEFMODS )


Po co Ci w tym i w wielu innych miejscach referencje?

3. Użycie Smarty - pomijając już samą absurdalność wyboru właśnie tego systemu szablonów (już lepiej w czystym PHP pisać), Twoje twierdzenie to niepotrzebne wynajdowanie koła od zera, gdyż taki projekt "uniwersalnego portu dla systemów szablonów" już istnieje i ma się całkiem dobrze.

4. core/modules/hardened.so.php - na co takie cuda? Magia przy parsowaniu danych wejściowych na dłuższą metę to jedno wielkie zło.

5. Bałagan w nazewnictwie funkcji, metod, klas...

6. Wynajdowanie kół od zera także w kilku innych miejscach. Przykład to system językowy - klepiesz wszystko od A do Z, tymczasem PHP 5.3 wprowadza bardzo fajne unikodowe klasy typu MessageFormatter, które dają tłumaczom większą precyzję?


--------------------
Specjalista ds. głupich i beznadziejnych, Zyx
Nowości wydawnicze: Open Power Collector 3.0.1.0 | Open Power Autoloader 3.0.3.0
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 15:33:11
Post #6





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Cytat(Zyx)
Po co Ci w tym i w wielu innych miejscach referencje?


Ponieważ oszczędzam każdy bajt pamięci, i nie potrzebuję powielać tablic jak mogę odwołać się do ich pamieci.

Cytat(Zyx)
gdyż taki projekt "uniwersalnego portu dla systemów szablonów" już istnieje i ma się całkiem dobrze


Ale ten projekt nie jest modułem do mojego frameworka, tak więc nie mogę go swobodnie przyczepić i z niego korzystać - PHP nie oferuje takich możliwości.
Gdybym chciał używać tego uniwersalnego portu dla wszystkich szablonów to musiałbym regularnie go pobierać z każdą nową wersją i modyfikować tak aby pasował u mnie.

Cytat(Zyx)
4. core/modules/hardened.so.php - na co takie cuda? Magia przy parsowaniu danych wejściowych na dłuższą metę to jedno wielkie zło.


Ten moduł jest domyślnie wyłączony, to jedynie ciekawostka - jeżeli ktoś chce to może używać takiego modułu.

Cytat(Zyx)
6. Wynajdowanie kół od zera także w kilku innych miejscach. Przykład to system językowy - klepiesz wszystko od A do Z, tymczasem PHP 5.3 wprowadza bardzo fajne unikodowe klasy typu MessageFormatter, które dają tłumaczom większą precyzję?


To moja standardowa biblioteka tłumacza.
Zauważ, że tą bibliotekę w bardzo prosty sposób można zastąpić w przyszłości inną biblioteką która będzie używać np. MessageFormatter, to nie problem.
MessageFormatter mogę wprowadzić do projektu jak będzie można, jest to świetna rzecz.

Cytat(Zyx)
5. Bałagan w nazewnictwie funkcji, metod, klas...


Dlaczego tak uważasz?
Jeżeli to faktycznie prawda ( ja tego nie zauważam ) to myślę, że porządna dokumentacja to naprawi.

Cytat(Zyx)
Jaki jest sens używania niestandardowego nazewnictwa


Wybacz, po prostu przyznaję się, że NIE ZNAM "STANDARDOWEGO NAZEWNICTWA".



-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 15:35:11


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
erix
post 1.09.2010, 16:39:51
Post #7





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
klepiesz wszystko od A do Z, tymczasem PHP 5.3 wprowadza bardzo fajne unikodowe klasy typu MessageFormatter

Ta, a PHP 5.3 jest już tak popularny na serwerach, że można go śmiało używać....

/irony mode off/

Cytat
To jedna ze stron która działa na frameworku.

Co z mod_rewrite?

.so.php - co znaczy SO, bo jakoś nie mogę tego z niczym skojarzyć prócz uniksowych odpowiedników .dll.

Cytat
"Kernel Module Triggers" - czyli odpowiednie reguły które jeżeli się zgadzają to moduł zostanie załadowany ( uproszczona budowa zapewnia szybkość wykonywania kodu )

A tego kompletnie nie jarzę. biggrin.gif

  1. public function Delete ($What='', $From, $Where='', $OrderBy='', $POS='', $LimitFrom='', $LimitTo='')
  2. {

Huh, domniemam że u Ciebie coś w stylu modelu musi być w DB i np. zawartości katalogu nie możesz użyć wymiennie (tzn. wymieniasz adapter w modelu i nie trzeba nic grzebać)?

index:
  1. # DB and CFG variables will not be duplicated, there is a reference at class function
  2. $Kernel = new tuxKernel ( $CFG, $MODS, $HTML, $DEFMODS );
  3. $SQL = new tuxMyDB ( $DB, $CFG, $Kernel );


(pomijam już fakt, że wszędzie będzie prawie ten sam kod, więc po co do indeksa wrzucać? winksmiley.jpg)

Musisz się każdorazowo łączyć z DB? A jak wykonuję stronę na plikach bądź cache'uje, to nawet jeśli wszystkie dane z cache odpowiadają zapotrzebowaniu, to i tak połączenie zostanie nawiązane? Fajnie, że zrobiłeś module on demand, ale zysk jest minimalny w porównaniu z tą samą techniką stosowaną przy łączeniu z DB.

Cytat
Uwaga, uwaga, w celu rozwiania pewnych uwag i wątpliwości pojęcie framework zostało objęte cudzysłowiem ponieważ jest to framework po mojemu, jeżeli komuś się nie podoba to nie musi używać i nie, nie będę patrzeć na Zend Framework czy inne frameworki - ten jest inny!

Ale są pewne standardy, które - pomimo nieco większego nakładu pracy przy tworzeniu - umożliwiają późniejsze szybsze i bardziej eleganckie pisanie aplikacji, chociażby mod_rewrite, podział na (H)MVC/MVP (dopiero po napisaniu paru aplikacji na bazie własnego frameworka można dostrzec, czego brakuje), czy formularze.

Nie ma w nim, niestety, nic porażającego...


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 17:48:47
Post #8





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Cytat(erix)
Huh, domniemam że u Ciebie coś w stylu modelu musi być w DB i np. zawartości katalogu nie możesz użyć wymiennie (tzn. wymieniasz adapter w modelu i nie trzeba nic grzebać)?


Ten fragment mam zamiar przepisać tak aby części bazy danych były wymienne a co do samego Kernela to projekt nie zakłada, że będzie wymienny.
Przepisanie tego fragmentu nie pochłonie wiele pracy, obecny kod służył do testów..

Cytat(erix)
Co z mod_rewrite?


Całość jest i będzie przygotowywana pod mod_rewrite, niestety narazie nie stoi to wysoko bo całość testuję na lighttpd bez mod_rewrite.

Cytat(erix)
.so.php - co znaczy SO, bo jakoś nie mogę tego z niczym skojarzyć prócz uniksowych odpowiedników .dll.


Nazywając "Jądro" Kernel, a pluginy modułami wprowadzam "styl nazw Uniksowych" do mojego projektu.

Cytat(erix)
Musisz się każdorazowo łączyć z DB? A jak wykonuję stronę na plikach bądź cache'uje, to nawet jeśli wszystkie dane z cache odpowiadają zapotrzebowaniu, to i tak połączenie zostanie nawiązane? Fajnie, że zrobiłeś module on demand, ale zysk jest minimalny w porównaniu z tą samą techniką stosowaną przy łączeniu z DB.


Module on demand to po prostu prosta funkcja która pozwala na ominięcie zależności, jest to standard nazwany "po imieniu" w projekcie.

Co do bazy danych, to jak widzisz - łączę się z DB każdorazowo.
Myślę, że wprowadzenie jakiegoś cache nie będzie wcale problemem, jednak z tym jeszcze poczekam.

Cytat(erix)
A tego kompletnie nie jarzę. biggrin.gif


Proszę zatem przeczytać cały post, nie tylko fragmenty.
W dolnej częsci postu *w komentarzu konfiguracji* jest pokazany przykład zastosowania.
Nie jest to jakaś zaskakująca funkcja w PHP, jednak jest zaskakująca w tym "frameworku" ze względu na jego budowę.

Cytat(erix)
Ale są pewne standardy, które - pomimo nieco większego nakładu pracy przy tworzeniu - umożliwiają późniejsze szybsze i bardziej eleganckie pisanie aplikacji, chociażby mod_rewrite, podział na (H)MVC/MVP (dopiero po napisaniu paru aplikacji na bazie własnego frameworka można dostrzec, czego brakuje), czy formularze.


Wybierając mój "framework" wybiera się coś innego niż reszta frameworków, lecz bardzo chętnie przyjrzę się konkretnym standardom i jeżeli są warte zaimplementowania to z pewnością zaimplementuję ale jednak chcę nadal aby projekt rozwijał się inną drogą.

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 17:50:47


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
mike
post 1.09.2010, 18:02:37
Post #9





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Zamiast komentować kod włóż wysiłek w jego poprawę.
Jeśli kod wymaga komentarza to znaczy, że jest nieczytelny.
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 18:28:56
Post #10





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Cytat(mike @ 1.09.2010, 18:02:37 ) *
Zamiast komentować kod włóż wysiłek w jego poprawę.
Jeśli kod wymaga komentarza to znaczy, że jest nieczytelny.


To, że komentuję kod to nie znaczy, że jest nieczytelny.
Po prostu opisuję go aby każdy przeglądajcy "był w kontekście" bez "główkowania" co gdzie i jak.

-- WebNuLL


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
phpion
post 1.09.2010, 18:38:18
Post #11





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(Babcia@Stefa @ 1.09.2010, 19:28:56 ) *
To, że komentuję kod to nie znaczy, że jest nieczytelny.
Po prostu opisuję go aby każdy przeglądajcy "był w kontekście" bez "główkowania" co gdzie i jak.

Cytat
2. «trudny do zrozumienia»

http://sjp.pwn.pl/slownik/2488483/nieczytelny

smile.gif

Jeśli już komentujesz to używaj phpDoca. Wygenerujesz sobie potem całkiem sprytną dokumentację.

Odnośnie kodu: brak konsekwencji i trzymania się przyjętego* standardu!
http://github.com/webnull/OpenWikiBlog/blo...hardened.so.php
  1. private function SearchMatches ( $String );
  2. // niżej cudza funkcja, ale wypadałoby ją "poprawić"
  3. private function stristr_array( $haystack, $needle );

http://github.com/webnull/OpenWikiBlog/blo...es/hooks.so.php
  1. public function start_hook ($Name, &$Array);

Zdecyduj się: małe czy wielkie litery (zarówno w nazwach metod i zmiennych), camelCase czy under_score.

* przez Ciebie, nie jakiegoś ogólnie przyjętego.

Ten post edytował phpion 1.09.2010, 18:39:29
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 18:41:55
Post #12





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Dzięki phpion, zapomniałem o "moim" standardzie tak już wyszło przy kodzeniu.

Widziałem phpDoc'a w akcji, ale niestety sam jeszcze nie używałem ale jakoś przy użyciu manuala Sobie poradzę smile.gif

Do poprawy jest nie wiele, dzięki.

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 18:43:37


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
SHiP
post 1.09.2010, 18:45:15
Post #13





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


Cytat(erix @ 1.09.2010, 16:39:51 ) *
Ta, a PHP 5.3 jest już tak popularny na serwerach, że można go śmiało używać....

/irony mode off/


Popieram erixa. Widzisz Zyx, ta klasa jest troszkę kretyńska ponieważ wprowadza swój własny format. To wcale nie jest ułatwienie dla tłumaczy w czasach gdy jest ogromna ilość edytorów tłumaczeń w formacie po lub xml.

--
W core/modules/exceptions.so.php w metodzie private function MakeADump(&$RID) masz pisanie do pliku ale nie blokujesz tego pliku na czas zapisu. Ja bym użył po prostu file_put_contents().

EDIT:

Zyx mógłbyś podać przykład zastosowania tego MessageFormattera dla zdania "There are %number_of_dogs% dogs"
There are 5 dogs => Tam jest 5 psów
There are 2 dogs => Tam są 2 psy
Czytam tego manuala i po prostu tego nie widzę ;]


Ten post edytował SHiP 1.09.2010, 18:56:10


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 18:52:55
Post #14





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Dzięki SHiP, poprawione.

Wszelkie poprawki jakie wnoszę teraz pojawią się w commicie po godzinie 22 kiedy ukończę wprowadzać zmiany w libadmin.

@edit
Jednak commit poszedł wcześniej, zmiany można już zobaczyć.
Jestem bardzo wdzięczny za współpracę, jeżeli znajdziecie jeszcze jakieś błędy to proszę zgłaszać z chęcią dam plusika na forum smile.gif

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 19:19:48


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
erix
post 1.09.2010, 19:18:13
Post #15





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




Cytat
Proszę zatem przeczytać cały post, nie tylko fragmenty.
W dolnej częsci postu *w komentarzu konfiguracji* jest pokazany przykład zastosowania.
Nie jest to jakaś zaskakująca funkcja w PHP, jednak jest zaskakująca w tym "frameworku" ze względu na jego budowę.

~mike ma rację - popatrz np. na jQuery - po kilkumiesięcznej przerwie w klepaniu kodu jestem w stanie napisać wszystko bezbłędnie bez zaglądania dokumentacji. Po co coś niepotrzebnie komplikować...?

Cytat
Nazywając "Jądro" Kernel, a pluginy modułami wprowadzam "styl nazw Uniksowych" do mojego projektu.

A nie wystarczy rozdzielić na katalogi...? Ile bibliotek PHP widziałem, to jeszcze ani razu takiej konwencji... Podejrzewam, że nie tylko ja zadam pytanie WTF? na widok .so.php.

Cytat
Co do bazy danych, to jak widzisz - łączę się z DB każdorazowo.
Myślę, że wprowadzenie jakiegoś cache nie będzie wcale problemem, jednak z tym jeszcze poczekam.

Na co chcesz czekać? To powinno być napisane OD RAZU. Potem będziesz tylko pisał na kolanie, bo trzeba coś wprowadzić.

Cytat
Wybierając mój "framework" wybiera się coś innego niż reszta frameworków, lecz bardzo chętnie przyjrzę się konkretnym standardom i jeżeli są warte zaimplementowania to z pewnością zaimplementuję

Coś innego, czyli? Zachęć mnie. Podaj jakieś argumenty, dla których WARTO korzystać z Twojego fw. Nie chodzi mi o zawartość pierwszego Twojego posta.


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 19:24:05
Post #16





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Cytat(erix)
Coś innego, czyli? Zachęć mnie. Podaj jakieś argumenty, dla których WARTO korzystać z Twojego fw. Nie chodzi mi o zawartość pierwszego Twojego posta.


Nie muszę podawać argumentów, masz kod.
Nikogo nie zachęcam, niech każdy używa co uważa za właściwe dla niego, po prostu tworzę framework nr. milion+1 jako alteratywę dla reszty.
Jeżeli ktoś nie widzi zastosowania mojego fw, to zapewne inny fw będzie się nadawać na to właśnie zastosowanie.

-- WebNuLL


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
SHiP
post 1.09.2010, 19:24:29
Post #17





Grupa: Zarejestrowani
Postów: 697
Pomógł: 47
Dołączył: 19.12.2003
Skąd: Lublin

Ostrzeżenie: (0%)
-----


@erix: Podejrzewam, że so = shared object - http://en.wikipedia.org/wiki/Executable_and_Linkable_Format ale ja też nie wiem dlaczego akurat takie nazewnictwo

@phpion: ja polecam Doxygen zamiast phpDocumentora (jest cos takiego jak phpDoc?). Jest dużo lepiej opisany.

Tak przeglądam te źródła i czasem masz jakieś drobne głupoty winksmiley.jpg np.
  1. } elseif (isset($this->Apps[$Mod])){
  2.  
  3. # default apps
  4. $APP = $this->Apps[$Mod];
  5.  
  6. return $this->Mods[$APP];
  7. }


Po co ta zmienna $APP ?

  1. $method=$Params[1]; // method name
  2. $this->Mods[$Params[0]]->$method($Params[2]);


Można
  1. $this->Mods[$Params[0]]->$Params[1]($Params[2]);


Często niepotrzbnie dodajesz ampersandy do parametrów. Obiekty i tak są przesyłane w formie referencji. Więc zapis typu:
  1. $this -> Kernel = &$Kernel;

Jest dziwny. Od piątej wersji aby sklonować obiekt trzebaby napisać:
  1. $this -> Kernel = clone $Kernel;

Domyślnie jest zawsze referencja.

PS: mysql_escape_string nie jest bezpieczną funkcją. W pewnych specyficznych warunkach da się ją obejść. Stosuj bindowanie parametrów lub mysqli->real_escape_string()


--------------------
Warsztat: Kubuntu, PhpStorm, Opera
Go to the top of the page
+Quote Post
Babcia@Stefa
post 1.09.2010, 19:35:42
Post #18





Grupa: Zarejestrowani
Postów: 654
Pomógł: 17
Dołączył: 19.03.2006
Skąd: z kosmosu ;)

Ostrzeżenie: (0%)
-----


Cytat(SHiP)
Po co ta zmienna $APP ?


Nie potrafię inaczej tego zapisać aby obeszło się bez błędu.
Pokaż Mi proszę jak byś chciał to napisać inaczej.

Cytat(SHiP)
Można


Faktycznie można i już poprawiłem (lokalnie) biggrin.gif

Cytat(SHiP)
Jest dziwny. Od piątej wersji aby sklonować obiekt trzebaby napisać:


Wybacz, stare nawyki z PHP4.

@edit
Zacommitowałem zmiany.

-- WebNuLL

Ten post edytował Babcia@Stefa 1.09.2010, 19:38:27


--------------------
Środowisko testowe (desktop) - Gedit, lighttpd, sftp, rsync, xfce4-terminal, chromium, firefox4 | System: Gentoo ~x86
O'Neill - serwer WWW @ lighttpd, links, nano, rsyncd, sftpd | System: Debian
Go to the top of the page
+Quote Post
mike
post 1.09.2010, 19:36:56
Post #19





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

Ostrzeżenie: (0%)
-----


Cytat(Babcia@Stefa @ 1.09.2010, 19:28:56 ) *
To, że komentuję kod to nie znaczy, że jest nieczytelny.
Po prostu opisuję go aby każdy przeglądajcy "był w kontekście" bez "główkowania" co gdzie i jak.
Więc jak opiszesz kod, który wymaga dodatkowych instrukcji w postaci komentarza?
Komentarze są zbędne, jeśli kod jest czytelny i zrozumiały. Jeśli potrzebujesz opisu w postaci tekstu to znaczy, że powinieneś popracować nad kodem.

Ten post edytował mike 1.09.2010, 19:44:35
Go to the top of the page
+Quote Post
phpion
post 1.09.2010, 19:44:19
Post #20





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(SHiP @ 1.09.2010, 20:24:29 ) *
jest cos takiego jak phpDoc?

http://en.wikipedia.org/wiki/PHPDoc

Cytat(Babcia@Stefa @ 1.09.2010, 20:35:42 ) *
Nie potrafię inaczej tego zapisać aby obeszło się bez błędu.
Pokaż Mi proszę jak byś chciał to napisać inaczej.

  1. } elseif (isset($this->Apps[$Mod])){
  2. return $this->Mods[$this->Apps[$Mod]];
  3. }


Ten post edytował phpion 1.09.2010, 19:49:56
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 19.07.2025 - 09:53