Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zasady pisania na forum Pro

Tematy na forum Pro mogą zakładać jedynie moderatorzy. W otwartych tematach może pisać każdy, kto ma coś fachowego do powiedzenia. Wszystkie posty nie wnoszące nic do tematu będą natychmiast usuwane, a ich autorzy dostaną ostrzeżenie.
Jeśli uważasz, że jakiś temat jest warty dyskusji na tym forum, zgłoś go w temacie Propozycje.

10 Stron V  « < 7 8 9 10 >  
Reply to this topicStart new topic
> Włączanie plików + autoloader, chętnie bym posłuchał ciekawych pomysłów
DjKermit
post 22.01.2007, 12:26:38
Post #161





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 18.06.2005

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


Witam.
Ja wykombinowałem coś takiego:
Klasa:
  1. <?php
  2. class ClassLoader {
  3.  
  4. /**
  5.  * Class file name sufix
  6.  *
  7.  * @var string
  8.  */
  9. private $file_sufix = '.class.php';
  10.  
  11. /**
  12.  * Class map cache file name
  13.  *
  14.  * @var string
  15.  */
  16. private $cache_file_name = 'class_map_cache.ini.php';
  17.  
  18. /**
  19.  * Path to cache file
  20.  *
  21.  * @var string
  22.  */
  23. private $cache_file_path = CONFIG_PATH;
  24.  
  25. /**
  26.  * Root path of the project
  27.  *
  28.  * @var string
  29.  */
  30. private $base_path = BASE_PATH;
  31.  
  32. /**
  33.  * Path to class files & packages
  34.  *
  35.  * @var string
  36.  */
  37. private $class_path = CLASS_PATH;
  38.  
  39. /**
  40.  * All files paths from readed dir
  41.  *
  42.  * @var array
  43.  */
  44. private $readed_dir;
  45.  
  46. /**
  47.  * Class map content
  48.  *
  49.  * @var array
  50.  */
  51. private $class_map;
  52.  
  53. /**
  54.  * ClassLoader class instance
  55.  * 
  56.  * @var ClassLoader
  57.  */
  58. private static $instance;
  59.  
  60.  
  61.  
  62.  
  63. /**
  64.  * Constructor
  65.  * 
  66.  * @access private
  67.  */
  68. private function __construct() {
  69. $this->getClassMap();
  70. }
  71.  
  72. /**
  73.  * Gets singleton instance of ClassLoader class
  74.  *
  75.  * @return ClassLoader
  76.  * @access public
  77.  */
  78. public static function getInstance() {
  79. if (is_null(self::$instance)) {
  80. self::$instance = new self;
  81. }//end if
  82. return self::$instance;
  83. }
  84.  
  85.  
  86.  
  87.  
  88. /**
  89.  * Loads single class or all class package 
  90.  *
  91.  * @param string $class_name - name of class to load
  92.  * @access public
  93.  */
  94. public function load($class_name) {
  95. $class_name = str_replace('.', DIRECTORY_SEPARATOR, $class_name);
  96. if (strstr($class_name, '*')) { // load all class package
  97. $package_path = str_replace('*','', $class_name);
  98. $classes_arr = $this->getDirContents($this->class_path . $package_path);
  99. $this->loadClass($classes_arr);
  100. }else{ // load single class
  101. $path = $this->class_path . $class_name . $this->file_sufix;
  102. $this->loadClass(array($class_name => $path));
  103. }//end if
  104. }
  105.  
  106.  
  107. /**
  108.  * Serches for requested class in entire project and loads automaticly if found
  109.  *
  110.  * @param string $class_name
  111.  * @access public
  112.  */
  113. public function autoLoad($class_name) {
  114. if (array_key_exists($class_name, $this->class_map) && file_exists($this->class_map[$class_name])) {
  115. require_once($this->class_map[$class_name]);
  116. }else{
  117. $this->generateClassMap();
  118. if (array_key_exists($class_name, $this->class_map) && file_exists($this->class_map[$class_name])) {
  119. require_once($this->class_map[$class_name]);
  120. }else{
  121. throw new Exception('Class AutoLoad failed, file '. $class_name . $this->file_sufix .' not found');
  122. }//end if
  123. }//end if
  124. }
  125.  
  126.  
  127. /**
  128.  * Loads class
  129.  *
  130.  * @param array $path
  131.  * @access private
  132.  */
  133. private function loadClass($path) {
  134. foreach($path as $key => $val) {
  135. if (file_exists($val)) {
  136. require_once($val);
  137. }else{
  138. throw new Exception('Load class failed, file '. $key . $this->file_sufix .' not found');
  139. }//end if
  140. }//end foreach
  141. }
  142.  
  143.  
  144. /**
  145.  * Reads class map from cache
  146.  *
  147.  * @access private
  148.  */
  149. private function getClassMap() {
  150. if (file_exists($this->cache_file_path . $this->cache_file_name)) {
  151. $this->class_map = parse_ini_file($this->cache_file_path . $this->cache_file_name);
  152. }else{
  153. if (!is_dir($this->cache_file_path)) mkdir($this->cache_file_path);
  154. }//end if
  155. if (empty($this->class_map)) $this->generateClassMap();
  156. }
  157.  
  158.  
  159. /**
  160.  * Generates new class map
  161.  *
  162.  * @access private
  163.  */
  164. private function generateClassMap() {
  165. $this->getDirContents($this->base_path);
  166. $this->class_map = $this->readed_dir;
  167. $this->saveClassMap();
  168. }
  169.  
  170.  
  171.  
  172. /**
  173.  * Saves class map into a cache file
  174.  *
  175.  * @access private
  176.  */
  177. private function saveClassMap() {
  178. $str = ";<?php die('Configuration file, all data confidential'); ?>rnrn";
  179. foreach($this->class_map as $key => $val) {
  180. $str .= $key .' = '. $val . "rn";
  181. }//end foreach
  182. file_put_contents($this->cache_file_path . $this->cache_file_name, $str);
  183. }
  184.  
  185.  
  186. /**
  187.  * Gets specified directory contents recursively
  188.  *
  189.  * @param string $path
  190.  * @return array
  191.  * @access private
  192.  */
  193. private function getDirContents($path) {
  194. $this->readed_dir = array();
  195. $this->readDir($path);
  196. return $this->readed_dir;
  197. }
  198.  
  199.  
  200. /**
  201.  * Reads specified directory & if file name contains "class" substring adds path to $readed_dir array
  202.  *
  203.  * @param string $path
  204.  * @access private
  205.  */
  206. private function readDir($path) {
  207. if ($handle = opendir($path)) {
  208. while (($file = readdir($handle)) !== false) { 
  209. if (is_file($path . $file) && strstr($file, 'class') && !strstr($file, 'ClassLoader')) {
  210. $this->readed_dir[str_replace('.class.php', '', $file)] = $path . $file;
  211. }else if (is_dir($path . $file) && $file != '.' && $file != '..') {
  212. $this->readDir($path . $file . DIRECTORY_SEPARATOR);
  213. }//end if
  214. }//end while
  215. closedir($handle);
  216. }//end if
  217. }
  218.  
  219. }
  220.  
  221.  
  222.  
  223. /**
  224.  * Class auto loader
  225.  * 
  226.  * @param string $class_name
  227.  */
  228. function __autoload($class_name) {
  229. $cloader = ClassLoader::getInstance();
  230. $cloader->autoLoad($class_name);
  231. }
  232.  
  233. ?>

config.php
  1. <?php
  2. /** Base path */
  3. define('BASE_PATH', dirname(__FILE__) .'/');
  4. /** Path to config files */
  5. define('CONFIG_PATH', BASE_PATH . 'config/');
  6. /** Path to class and interface files */
  7. define('CLASS_PATH', BASE_PATH .'classes/');
  8. ?>


możliwość ładowania klas trochę IMO przyjemniej niż require_once i klepanie ścieżki
możliwość ładowania paczek klas
autoloader
mapa klas keszowana w pliku ini
gdy w keszu nie ma żądanej klasy jest odświeżany i ponowna próba załadowania klasy, jeśli brak - wyjątek

Przykładowe wywołanie:
  1. <?php
  2. require_once('config.php');
  3. require_once(CLASS_PATH .'core/ClassLoader.class.php');
  4. $c_loader = ClassLoader::getInstance();
  5. $c_loader->load('core.JakasKlasa'); // ładuje wskazaną klasę w "paczce" core
  6. $c_loader->load('core.*'); // ładuje całą "paczkę" core
  7. $c_loader->autoLoad('Smarty'); // odszukuje w całym projekcie wskazanej klasy i ładuje jeśli znajdzie
  8. ?>

metoda "load" ładduje klasy tylko ze zdefiniowanego w klasie ClassLoader katalogu i podżędnych
metoda "autoLoad" odszukuje żądaną klasę w całym projekcie

Ciekawi mnie co mądrzejsi będą mieli do powiedzenia.
Jeśli będzie się to do czegoś nadawało to można wrzucić do gotowych skryptów.

PS
Różnic przy tej klasie w porównaniu do ręcznego klepania require nie zauważyłem (ładowanie ok 20 klas).
//edit, no dobra tu troche przesadziłem, różnica jest
PS2
Jedyne wymaganie to nazwa pliku klasy powinna kończyć się ".class.php"

I co, nikt nic ?
Czyżby to było tak beznadziejne że nie warto się wypowiadać ?

Ten post edytował DjKermit 18.01.2007, 23:23:11


--------------------
emiker
Go to the top of the page
+Quote Post
hwao
post 23.01.2007, 18:14:47
Post #162


Developer


Grupa: Moderatorzy
Postów: 2 844
Pomógł: 20
Dołączył: 25.11.2003
Skąd: Olkusz




Bardzo ładna klasa, mi się podoba - jakbym stosował autoload to bym mógł ją spokojnie użyć.

Paser ini jest szybszy od serialize to też dodatkowy plus.

  1. <?php
  2. if (strstr($class_name, '*')) { // load all class package
  3. $package_path = str_replace('*','', $class_name);
  4. $classes_arr = $this->getDirContents($this->class_path . $package_path);
  5. ?>


Czy w tym momencie nie było by lepiej użyć glob" title="Zobacz w manualu php" target="_manual() ?
Go to the top of the page
+Quote Post
DjKermit
post 23.01.2007, 18:28:59
Post #163





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 18.06.2005

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


Dzięki bardzo.
Cytat(hwao @ 23.01.2007, 18:14:47 ) *
Czy w tym momencie nie było by lepiej użyć glob" title="Zobacz w manualu php" target="_manual() ?

Gdybym ładował pliki tylko ze wskazanego folderu to napewno tak, natomiast moim zamiarem było załadowanie plików/klas ze wskazanego folderu i wszystkich w nim zagłębionych.


--------------------
emiker
Go to the top of the page
+Quote Post
Turgon
post 23.01.2007, 18:32:35
Post #164





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


Hmm... Klasa ciekawa i sporo wyjaśnia smile.gif Dzięki. ale ja mam odmienny problem. Jak się ma sprawa z autoloadem interfejsów? Jak nie ma jest uruchamiana funkcja autoload?

Ten post edytował Turgon 23.01.2007, 21:37:19


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
bigZbig
post 24.01.2007, 16:19:57
Post #165





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Ja nazywam swoje klasy zgodnie z konwencją przyjętą w Zend Frameworku. Oczywiście zamiast prefixu Zend daje swój. DjKermit - narzucając obowiązek nadawania klasom sufixu class.php ograniczasz swojego autoloadera jedynie do klas swojego autorstwa i klas, które zawarte są w plikach o nazwach stosujących tę konwencję. Gdzieś na początku tego tematu jest przykład bardziej uniwersalnego skanera.

Dlaczego serializujecie swoje mapy albo tez parsujecie do postaci pliku ini? Nie lepiej zapisywać je od razu jako tablicę i na dzień dobry tę tablicę includować?


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
Turgon
post 25.01.2007, 15:51:37
Post #166





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


bigZbig: Podobno szybsze jest winksmiley.jpg Ale zastanowię się nad tabliczką smile.gif .


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
DjKermit
post 25.01.2007, 17:52:44
Post #167





Grupa: Zarejestrowani
Postów: 82
Pomógł: 0
Dołączył: 18.06.2005

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


Cytat(bigZbig @ 24.01.2007, 16:19:57 ) *
DjKermit - narzucając obowiązek nadawania klasom sufixu class.php ograniczasz swojego autoloadera jedynie do klas swojego autorstwa i klas, które zawarte są w plikach o nazwach stosujących tę konwencję. Gdzieś na początku tego tematu jest przykład bardziej uniwersalnego skanera.


No tak, ale nie piszę publicznego FW tylko pewien systemik, którego częścią jest ten loader, i nawet jeśli korzystam z cudzych klas to przerabiam je do swoich konwencji.

Cytat(bigZbig @ 24.01.2007, 16:19:57 ) *
Dlaczego serializujecie swoje mapy albo tez parsujecie do postaci pliku ini? Nie lepiej zapisywać je od razu jako tablicę i na dzień dobry tę tablicę includować?


IMO gryzie się to z ideą OOP bo inkludująć tablicę masz ją w globalu a nie w klasie czy metodzie klasy, pozatym podobno ini jest najszybsze, no i jakoś tak czytelniej.


--------------------
emiker
Go to the top of the page
+Quote Post
bigZbig
post 25.01.2007, 19:34:40
Post #168





Grupa: Zarejestrowani
Postów: 740
Pomógł: 15
Dołączył: 23.08.2004
Skąd: Poznań

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


Jak init może być szybsze od tablicy skoro parsując plik init zmieniasz go właśnie w tablicę. Tablicę możesz wczytywać do klasy poprzez pobranie zawartości pliku, a nie poprzez includa. Możesz też wygenerować mapę w postaci instancji klasy implementującego interfejs ArrayAccess i wtedy includujesz gotowy obiekt. Myślę, że powinno zadziałać choć nie testowałem.


--------------------
bigZbig (Zbigniew Heintze) | blog.heintze.pl
Go to the top of the page
+Quote Post
LBO
post 25.01.2007, 19:49:48
Post #169





Grupa: Zarejestrowani
Postów: 1 415
Pomógł: 117
Dołączył: 7.09.2005
Skąd: Warszawa

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


hmmm, parsowanie to parsowanie... i "na oko" parsowanie kodu php jest bardziej czasochłonne od pliku ini, który jest prostszy
Go to the top of the page
+Quote Post
Turgon
post 25.01.2007, 20:23:36
Post #170





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


Ja zapisuje zserializowaną tablicę i działa sprawnie.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
Strzałek
post 20.02.2007, 09:29:17
Post #171





Grupa: Przyjaciele php.pl
Postów: 384
Pomógł: 6
Dołączył: 11.09.2004
Skąd: Grodzisk Mazowiecki

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


O autoloadzie oraz przykładowa klasa generująca mapę opublikowałem post na moim blogu: http://strzalek.net/blog/8/autoload-automa...-ladowanie-klas


--------------------
Go to the top of the page
+Quote Post
Sh4dow
post 1.03.2007, 12:58:38
Post #172





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


Mnie zastanawia ile samo odwolanie sie do funkcji autoload zajmuje czasu, Bo to jak zbudujesz ta funkcje tak bedzie ona sprawna.
Jesli autoload ma szukac po wszystkich katalogach to tak, bedzie to wolne. Ale jesli podzielic pliki na grupy, uzyc odpowiednich schematow w budowaniu nazw klas to powinno byc to sprawne.
Chyba ciekawszym sposobem to kozystanie z magazynu obiektow polaczonego z autoloaderem. Odwolujesz sie do magazynu po obiekt jakiegos modelu, ktory ma miec zawsze jedna instancje aby powiedzmy nie powielac polaczen z baza danych. Magazyn sprawdza czy istnieje juz taka instancja, jesli nie sprawsza czy istnieje taka klasa, jesli nie szuka w odpowiednim katalogu pliku o odpowiedniej nazwie, po czym ładuje plik, tworzy instancje i ja zwraca.
Czy to jest wygodne czy nie to juz inna sprawa ale mozna takie rozwiazanie zmodyfikowac i poszerzyc o inne funkcjonalnosci dostosowane do swoich potrzeb.


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
Jarod
post 1.03.2007, 13:05:04
Post #173





Grupa: Zarejestrowani
Postów: 1 190
Pomógł: 27
Dołączył: 23.04.2005

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


Cytat(Sh4dow @ 1.03.2007, 12:58:38 ) *
Mnie zastanawia ile samo odwolanie sie do funkcji autoload zajmuje czasu,

Przyłączam się do pytania. Dzisiaj zauważyłem (i nie wiem dlaczego), że zaincludowanie klasy w głównym pliku/kontrolerze jest prawie 2x szybsze niż zainkludowanie w klasie statycznej. To tak przy okazji..


--------------------
”Godzina nauki w życiu nowoczesnego apostoła jest godziną modlitwy.”
(św. Josemaría Escrivá, Droga, 335)
Go to the top of the page
+Quote Post
athabus
post 1.03.2007, 13:34:02
Post #174





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Wydaje mi się, że troszeczkę dochodzimy do granic abstrakcji :-)

90% wykonania funkcji autload to includowanie pliku i tego się nie ominie, niezależnie od tego czy includować będziemy za pomocą autoload czy ręcznie. Samo wywołanie tej funkcji zapewne "kosztuje" tyle co wywołanie każdej innej funkcji. Jest tak jak mówi Sh4adow - wszystko zależy od tego jak funkcja będzie napisana.

Ja osobiście robiłem testy na ZF - dopisałem do niego prosty autoloader dla własnych klas z mapą w pliku. Cóż mogę powiedzieć - funkcja zachowała się jak funkcja ;-) Wywołanie było dość kosztowne - ok 10-20% czasu wykonania skryptu jeśli dobrze pamiętam, ale to było spowodowane nie tyle samą funkcją co includowaniem samych plików. Wyników dokładnie nie pamiętam i nie mam ich już zapisanych, ale mój wniosek był mniej więcej taki:
- funkcja __autoload to dobre rozwiązanie i nie przynosi specjalnie dużych kosztów. Problem jaki się może pojawić to złe napisanie tej funkcji - np. brak mapy (czy jakiegoś jasnego układu) i każdorazowe przeszukiwanie folderów.

Ogólnie pytanie nie brzmi więc czy pisać autoloader tylko jak go napisać ;-) Ja z mojej metody jestem zadowolony. Dalsza optymalizacja, choć pewnie jest możliwa przy zwykłym projekcie nie ma większego sensu. Po prostu wzrost wydajności samego mechanizmu nawet o 100% nic konkretnego mi nie da, gdyż są to marginalne wartości.
Go to the top of the page
+Quote Post
grzegorzr
post 14.07.2007, 06:10:01
Post #175





Grupa: Zarejestrowani
Postów: 65
Pomógł: 3
Dołączył: 1.06.2007
Skąd: self::display()

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


uuu, temat trochę się zakurzył postanowiłem go rozruszać poprzez YAML:
YAML = mapa
wymyśliłem sobie że w __autoloadzie mamy (fragmenty):
  1. <?php
  2. function __autoload($sClassName) {
  3. $Autoload = Autoload::getInstance();
  4. //podajemy sciezke do pliku .yml
  5. $Autoload->setMapFile($map_file);
  6. // importujemy mape z formatu YAML do przyjaznej tablicy
  7. $Autoload->importMapFile();
  8. [...]
  9. // w strategicznym miejscu pilnujemy swiezosc mapy
  10. // jako argument podajemy czas unixowy $t
  11. // jesli wartosc $t>$tobecny-$t_ostaniaAktualizacja->akutalizuj()
  12. if(!$Autoload->isFileMapFresh(100))
  13. {
  14. $Autoload->addDir($ib_dir);
  15. $Autoload->addDir($data_dir);
  16.  // ta metoda najpierw przeszukuje wskazane katalogi
  17.  // wybiera pliki z rozszerzeniem .php
  18.  // zapisuje do tablicy['map'][nazwaklasy] = sciezka pelna do klasy
  19.  // nastepnie robimy export do pliku .yml
  20. $Autoload->setClassMap();
  21. }
  22. [...]
  23. // require teraz to juz przyjemnosc
  24. if (!require_once $Autoload->getClassPath($sClassName);)
  25. {
  26. //jakis blad
  27. };
  28. }
  29. ?>

w YAML pieknie to wyglada
  1. map:
  2. [nazwaklasy]:
  3. path: [sciezka do klasy]


Ten post edytował grzegorzr 15.07.2007, 18:15:05
Go to the top of the page
+Quote Post
Ludvik
post 14.07.2007, 09:29:16
Post #176





Grupa: Przyjaciele php.pl
Postów: 698
Pomógł: 3
Dołączył: 28.03.2004
Skąd: Wrocław

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


Chce Ci się pisać te mapy w YAML? Bo nie widzę sensu, żeby generować je automatycznie - parser YAML będzie wolniejszy od wczytania zserializowanej tablicy... A to, że ładniej wygląda, to drugorzędna sprawa w przypadku autoloadera. Z resztą, czy zaimportowanie folderów do przeszukania jest brzydkie? Moim zdaniem nie...


--------------------
Go to the top of the page
+Quote Post
deirathe
post 19.07.2007, 18:32:24
Post #177





Grupa: Zarejestrowani
Postów: 426
Pomógł: 32
Dołączył: 24.05.2007

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


  1. <?php
  2. function __autoload($classname){
  3. $path = "library".DIRECTORY_SEPARATOR."classes".DIRECTORY_SEPARATOR.str_replace("_", DIRECTORY_SEPARATOR , $classname).".class.php";
  4. if(!file_exists($path)){
  5. exit("Brak pliku: ".$path);
  6. }
  7. require_once($path);
  8. if(!class_exists($classname)){
  9. exit("Brak klasy: ".$classname);
  10. }
  11. }
  12. ?>

A ja zawsze wykorzystywałem to:P kod nie jest długi, co o tym myślicie?

Ten post edytował deirathe 19.07.2007, 18:36:36


--------------------
Kawałek mojego blogu
Everything should be as simple as possible but not simpler.
A Einstein
Go to the top of the page
+Quote Post
athabus
post 20.07.2007, 11:52:43
Post #178





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


Ta funkcja wymaga aby wszystkie klasy były w jednym katalogu. Wydaje mi się, że w dyskusji chodzi raczej o rozwiązanie, które działa dla całej aplikacji. Gdy masz np. 20 katalogów z różnymi klasami to raczej nie ma sensu wykonywać tylu akcji plikowych i szukać w każdym katalogu danej klasy, także w średniej aplikacji to się raczej by nie sprawdziło.
Go to the top of the page
+Quote Post
Turgon
post 20.07.2007, 22:11:45
Post #179





Grupa: Zarejestrowani
Postów: 800
Pomógł: 0
Dołączył: 26.11.2005
Skąd: Nowy Sącz

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


athabus: W takim przypadku mapy się wydają być jedynym sensownym wyjściem, z punktu estetyki i także wydajności.


--------------------
Jah Music Is On My Mind !
Go to the top of the page
+Quote Post
athabus
post 20.07.2007, 22:31:07
Post #180





Grupa: Zarejestrowani
Postów: 898
Pomógł: 48
Dołączył: 2.11.2005
Skąd: Poznań

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


wiem i sam właśnie map używam biggrin.gif
Go to the top of the page
+Quote Post

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

 



RSS Wersja Lo-Fi Aktualny czas: 28.04.2024 - 04:41