Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt] "framework" OpenWikiBlog
Forum PHP.pl > Inne > Oceny
Babcia@Stefa
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
SHiP
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
Spawnm
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?
Babcia@Stefa
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
Zyx
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ę?
Babcia@Stefa
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
erix
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...
Babcia@Stefa
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
mike
Zamiast komentować kod włóż wysiłek w jego poprawę.
Jeśli kod wymaga komentarza to znaczy, że jest nieczytelny.
Babcia@Stefa
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
phpion
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.
Babcia@Stefa
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
SHiP
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ę ;]
Babcia@Stefa
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
erix
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.
Babcia@Stefa
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
SHiP
@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()
Babcia@Stefa
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
mike
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.
phpion
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. }
SHiP
@mike: wcale tak nie jest. Niektórzy przyjmują, że komentarzy powinno być tyle, że po usunięciu kodu i zostawieniu samych komentarzy dało się aplikację napisać od nowa. To o czym mówisz to jedynie jedna z konwencji. Moim zdaniem zawsze się wybiera między:
1. mało komentarzy => kod czytelniejszy ale mniej optymalny
2. dużo komentarzy => kod mniej czytelny ale szybszy

Pomijam fakt, że w tym projekcie część komentarzy jest totalnie kretyńska: zobaczcie np. core/database.php
  1. //# What and From
  2. $SQL = 'SELECT ' .mysql_escape_string($What). ' FROM `' .$this->PREFIX.mysql_escape_string($From). '`';
  3.  
  4. //# Where
  5. if ( $Where != '' )
  6. {
  7. $Where = $this->convertWhere ( &$Where );
  8. $SQL .= ' WHERE' .$Where;
  9. }
  10.  
  11. //# OrderBy and POS
  12. if ( $OrderBy != '' )
  13. {
  14. $OrderBy = $this->convertWhat(&$OrderBy);
  15. $SQL .= ' ORDER BY ' .$OrderBy;
  16.  
  17. //# Pos ( ASC, DESC )
  18. if ( $POS == 'DESC' )
  19. $SQL .= ' DESC'; # DESCENDING
  20. else
  21. $SQL .= ' ASC'; # ASCENDING ( DEFAULT )
  22. }
  23.  
  24. //# Limit
  25. if ( $LimitFrom != '' AND $LimitTo != '' )
  26. {
  27. $SQL .= ' LIMIT ' .intval($LimitFrom). ',' .intval($LimitTo);
  28. }


EDIT:
dzięki za link winksmiley.jpg ale ubogi ten phpDoc.
erix
Cytat
Nie muszę podawać argumentów, masz kod.

No właśnie kod mnie nie zachęcił, ale może Twój fw ma jakieś szczególne funkcje, których nie widać na pierwszy rzut oka.

Mówisz teraz tak, jak prelegenci z Microsoftu na phpConie. Pytam: dlaczego wg Pana Expression Web jest lepszy od konkurencji? A on: wcale nie twierdzę, że jest lepszy..

Sory, ale skoro nie jesteś pewien, jako autor, że Twój fw ma jakieś atuty, to raczej wątpliwe, aby wyszedł on z garażu. Może to brutalne, co powiedziałem, ale konkurencja jest i skoro nie możesz wypunktować jego mocnych stron - lepiej poświęcić czas na poznawanie innych, rozplanowanych.

Sam od kilku lat rozwijam swojego fw i pomimo setek linii kodu, schematów powiązań między poszczególnymi elementami, nadal nie uważam, że nadaje się jeszcze do publicznych tekstów, znam jego słabe strony, ale jest też kilka mocnych, których inne nie mają.

W przypadku Twojego, niestety, kod nie jest mocną stroną i bez dokumentacji nie da się czegoś wygodnie pisać. Zaskocz mnie, pokaż że warto się nim zainteresować.

Marketing też jest istotny; nie sprzedasz nowej wiertarki z potrójnym udarem, jeśli na półce nie będzie się wyróżniała spośród reszty. Pamiętaj, że Twoja marka nie ma jeszcze wyrobionej opinii, więc musisz jakoś ZACHĘCIĆ odbiorców.
Zyx
Małe info - poszczególne fragmenty mogą być adresowane do różnych rozmówców.

Ad. referencji -> po pierwsze, używanie referencji do "oszczędzania pamięci" i "zwiększenia wydajności" to jedno wielkie nieporozumienie z takiego prostego powodu, że PHP posiada wbudowany mechanizm leniwego kopiowania, tj. właściwa kopia robiona jest dopiero wtedy, gdy dane mają ulec modyfikacji. Gdy dane są pobierane "tylko do odczytu", odczytywana jest dokładnie ta sama wartość, a ponieważ PHP nie musi tworzyć dodatkowych struktur danych na utrzymywanie referencji, takie coś jest nie tylko szybsze, ale paradoksalnie oszczędniejsze pamięciowo. Ponadto nie realizujesz nawet tego, co piszesz, bo w wielu miejscach owszem, argumenty przekazujesz przez referencję, ale później już robisz zwykłe przypisanie.

Ad. systemu szablonów -> widzisz, gdybyś używał standardowego nazewnictwa, nie musiałbyś nic dostosowywać z nową wersją, chyba że pomiędzy wydaniami ze zmienionym pierwszym numerkiem. Korzystam z wielu różnych bibliotek, które właśnie dzięki temu, że zachowują pewne wspólne konwencje, mogą być bez problemu używane razem i aktualizacja sprowadza się w zasadzie do wgrania nowych plików. Natomiast czym jest standardowe nazewnictwo ->
- http://www.zyxist.com/pokaz.php/standaryzacja_php
- http://groups.google.com/group/php-standar...-proposal?pli=1

Ad. klasy tłumaczeń -> a co ma format PO czy "XML" (w cudzysłowiu, bo nie ma czegoś takiego, jak "format XML". XML to meta-język, w którym dopiero można jakiś język opisać) do MessageFormattera, kiedy jedno i drugie zajmuje się zupełnie innymi rzeczami?
- PO - składowanie i zarządzanie tekstami do tłumaczenia
- MessageFormatter - formatowanie konkretnej wiadomości
Jedno drugiego nie wyklucza - możesz mieć teksty w formacie MessageFormattera, który jest dużo dokładniejszy, niż printf() (zwłaszcza w takich rzeczach, jak np. obsługa liczby mnogiej), zapisane w pliku PO. W ogóle poczytaj sobie nieco o tej klasie, a zwłaszcza na jakiej bibliotece bazuje to rozszerzenie (i ilu producentów i aplikacji z niej korzysta), bo Twoje słowa zupełnie nie pokrywają się z rzeczywistością.

Ad. różnych "opcjonalnych dodatków" - moim zdaniem warto zastanowić się czy niektóre z takich dodatków faktycznie są potrzebne. Już kilkakrotnie przekonałem się, że czasem lepiej jest powiedzieć "ma być tak i koniec", ponieważ w przeciwnym wypadku będziesz miał na każdym kroku mnóstwo dylematów "OK, jak ten moduł jest wyłączony, to mogę to zrobić prosto, ale ponieważ gość może go sobie włączyć, wtedy muszę to przewidzieć i dopisać tu jeszcze 154 ify, by obsłużyć wszystkie możliwe kombinacje".

Ad. PHP 5.3 -> zanim webnull skończy ten "framework", jeszcze wody w Wiśle upłynie. Dziwne, że jakoś nikt nie ma oporów przed polecaniem przestrzeni nazw, tak jak inni nie mają oporów przed ich stosowaniem, a tu się czepiacie o jedną głupią klasę. A potem się będzie biadolenie na blogach, że "PHP 5.3 jest już tyle czasu, a wciąż kupa skryptów nie korzysta z jego dobrodziejstw", tak jak to z PHP 4 było. Zresztą, po co mają to wprowadzać na hostingach, skoro programiści nie znają nawet podstawowych informacji o tym, co w tej wersji wprowadzono i mają podejście, że "po co mają się uczyć, skoro hostingowcy tego nie wprowadzają"? To się nazywa samospełniającą się przepowiednią i ja osobiście nie mam zamiaru w niej brać udziału. Jak ktoś chce być zacofańcem, a potem na to samo zacofanie narzekać, to było mi miło, ja się mu kłaniać nie zamierzam.
mike
~SHiP wybacz ale nazwiska sygnatariuszy manifestu Software Craftsmanship przekonują mnie bardziej.
Po lekturze Clean Code: A Handbook of Agile Software Craftsmanship faktycznie zacząłem pomijać komentarze na rzecz samo dokumentującego się, czytelnego kodu.
I uwierz mi, to nie chodzi o żadną optymalność czy szybkość kodu. Chodzi o jego czytelność i łatwość przyswajania przez czytelnika. Jednoznacznie brak komentarzy idzie na plus.

P.S.
Mój ulubiony komentarz to:
  1. public Klasa {
  2. /**
  3.   * Konstruktor domyślny.
  4.   */
  5. public Klasa() {
  6. }
  7. }
O RLY? biggrin.gif
Babcia@Stefa
Cytat(SHiP)
Pomijam fakt, że w tym projekcie część komentarzy jest totalnie kretyńska: zobaczcie np. core/database.php


To jest prawda, jednak te komentarze nie były na darmo.
Te komentarze ułatwiły Mi pisanie kodu tych funkcji, bez nich bym się pogubił więc raczej te komentarze są po prostu dla Mnie i mogę je usunąć ponieważ funkcje skończone..

-- WebNuLL
SHiP
@mike: zgadzam się i sądzę, że ilość komentarzy należy zmniejszać do minimum. Czasem jednak skomplikowanie algorytmu/wyrazenia regularnego etc. jest tak duże, że trzeba to opisać w kilku słowach winksmiley.jpg. Po prostu są ludzie, którzy twierdzą inaczej.

@zyx: Czepiasz się szczegółów. Chodziło po prostu o trzymanie tłumaczeń w pliku PO lub w pliku xml(i tutaj np xliff). Wybacz ale Twój wcześniejszy post można było odebrać jakby php 5.3 miało wbudowany system tłumaczący. W dalszym ciągu jednak proszę o przykład, ponieważ klasa zastosowana przez Babcia@Stefa nie jest tragiczna, a obsługę MessageFormattera może w każdej chwili dodać(np gdy 5.3 będzie bardziej popularne).
Babcia@Stefa
Cytat(SHiP @ 1.09.2010, 22:21:14 ) *
@mike: zgadzam się i sądzę, że ilość komentarzy należy zmniejszać do minimum. Czasem jednak skomplikowanie algorytmu/wyrazenia regularnego etc. jest tak duże, że trzeba to opisać w kilku słowach winksmiley.jpg. Po prostu są ludzie, którzy twierdzą inaczej.

@zyx: Czepiasz się szczegółów. Chodziło po prostu o trzymanie tłumaczeń w pliku PO lub w pliku xml(i tutaj np xliff). Wybacz ale Twój wcześniejszy post można było odebrać jakby php 5.3 miało wbudowany system tłumaczący. W dalszym ciągu jednak proszę o przykład, ponieważ klasa zastosowana przez Babcia@Stefa nie jest tragiczna, a obsługę MessageFormattera może w każdej chwili dodać(np gdy 5.3 będzie bardziej popularne).


Jest coś takiego jak sprawdzanie wersji PHP przez skrypt (co może być jednak wyłączone na niektórych serwerach dlatego odpada), ale jest także class_exists które może sprawdzić czy klasa MessageFormattera istnieje - jeżeli tak to załadować i przygotować do używania a jeżeli nie to usuwać syntax MessageFormattera ( "{" i "}" ) wyrażeniami regularnymi.

-- WebNuLL
nospor
a ja sie poczepiam trochę bazki
  1. `id` int(2) NOT NULL AUTO_INCREMENT,
  2. `name` varchar(30) NOT NULL,
  3. `passwd` varchar(180) NOT NULL,
  4. `privigle` int(2) NOT NULL,
  5. `restrictip` varchar(200) NOT NULL COMMENT 'Here is a place for PHP serialized array with ip numbers',
  6. `disabled` int(1) NOT NULL COMMENT 'Is admin account enabled?',
  7. `unblock_time` int(20) NOT NULL COMMENT 'When the account will become avaible? - Unix timestamp format only',
  8. PRIMARY KEY (`id`)
  9. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;

1) int(1), int(2) - te cyferki w nawiasach niczemu nie sluzą (sluża jedynie dla zerofill ktorego nie uzywasz) a juz na pewno nie określają rozmiaru przechowywanych liczb
2) `disabled` int(1) NOT NULL COMMENT 'Is admin account enabled?', - wartosc 0 lub 1 przechowujesz w typie INT ktory zajmuje 4 bajty. Tu nalezy dac pole TINYINT ktore zajmuje 1 bajt
3) `passwd` varchar(180) NOT NULL,
po insercie widzialem ze haslo to hash. Czemu wiec mowisz ze moze miec 180 znaków?
4) `restrictip` varchar(200) NOT NULL COMMENT 'Here is a place for PHP serialized array with ip numbers',
to powinna byc dodatkowa tabela
5) `unblock_time` int(20) NOT NULL COMMENT 'When the account will become avaible? - Unix timestamp format only',
o typach czasowych slyszal?
erix
Cytat
4) `restrictip` varchar(200) NOT NULL COMMENT 'Here is a place for PHP serialized array with ip numbers',
to powinna byc dodatkowa tabela

Już pomijam fakt, że adres IP można zapisać via ip2long w INT. A o różnicach w wydajności chyba wspominać nie muszę?

Babcia@Stefa
Cytat(erix @ 2.09.2010, 19:34:07 ) *
Już pomijam fakt, że adres IP można zapisać via ip2long w INT. A o różnicach w wydajności chyba wspominać nie muszę?


Nie chciałem za bardzo nie potrzebnie rozbudowywać bazy danych, ale skoro mówicie, że wypadałoby to tak uczynię - jednak zrobię to w Sobotę/Niedzielę bo wtedy znajdę czas.

Dziękuję.

Cytat(nospor)
o typach czasowych slyszal?


Zrobiłem to po prostu starym sposobem, dzięki za uwagę.

Cytat(nospor)
wartosc 0 lub 1 przechowujesz w typie INT ktory zajmuje 4 bajty. Tu nalezy dac pole TINYINT ktore zajmuje 1 bajt


Oh, faktycznie tutaj zrobiłem błąd, poprawię go w najbliższym commicie ( sobota/niedziela ).

Cytat(nospor)
po insercie widzialem ze haslo to hash. Czemu wiec mowisz ze moze miec 180 znaków?


Baza danych narazie taka testowa jest, a ile hash ma znaków tego nie liczyłem narazie więc nie wiem ile mogę tam wstawić.

-- WebNuLL
erix
Cytat
a ile hash ma znaków tego nie liczyłem narazie więc nie wiem ile mogę tam wstawić.

Bez urazy, ale bez wiedzy o czymś takim piszesz fw...?
mike
Cytat(Babcia@Stefa @ 2.09.2010, 22:14:38 ) *
Baza danych narazie taka testowa jest, a ile hash ma znaków tego nie liczyłem narazie więc nie wiem ile mogę tam wstawić.
Brak jakichkolwiek podstaw i pisanie frameworka? Puknij się w głowę i wracaj do nauki podstaw.
No ale odpowiem Ci: To zależy jaki hash
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.