Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Rozszerzanie klas
joytec
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


Zastanawiam sie czy mozna rozszerzyc classe o klase ktora znajduje sie w innym katalogu np podrzednym zazaczam ze stosuja funcje function __autoload($className) w ktorej sa warunki jesli klasa znajduje sie w katalogu a to zaladuj jesli b to zaladuj z katalogu b

konkretnie

chce rozszerzyc clsse a o b z tym ze classa a znajduje sie w katalogu a, klasa b w podkatalogu b w katalogu a


Prosze o jakies sugestie

Ten post edytował joytec 19.03.2010, 09:26:08
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 14)
Crozin
post
Post #2





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


1) Co to jest classa?
2) Nie za bardzo wiem w czym problem. Napisz na tyle normalny autoloader by sobie poradził z wczytaniem klas z różnych źródeł.
Go to the top of the page
+Quote Post
joytec
post
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


klasa w php

class a{

}

to jest klasa


i wlasnie o to chodzi zeby nie zmieniac takiej klasy w wileu zrodlach tylko zeby ja rozszerzyc
Go to the top of the page
+Quote Post
phpion
post
Post #4





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




Pytanie "Co to jest classa?" było ironią.

Tak jak napisał poprzednik: odpowiedni autoloader (np. w stylu PEAR czyli zmiana _ na / w nazwie klasy) albo po prostu require_once w pliku z definicją klasy rozszerzającej. Nie bardzo wiem z czym masz tak naprawdę problem.
Go to the top of the page
+Quote Post
joytec
post
Post #5





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


to ja wiem ze to ironia czepianie sie szczegolow wiec ironia jest napisanie co to klasa

o t chodzi ze uzywam mvc i jeden skrypt pracuje na wielu domenach, nie ktore jego czesci 'klasy' sie roznia wiec w obecnym rozwiazaniu ssa w podkatalogach, ale jak przychodzi jakas zmiana to mam tych katalogow wiele do zmiany wiec lepszym rozwiazaniem bedzie rozszerzenie bazowaj clasy i tam dopisywanie zmian. W obecnym rozwiazaniu klasy bardziej szczegolowe tkwia w podkatalogach wiec stad moje pytanie czy mozna rozszerzyc klase w znajdujaca sie podkatalogu do klasy bazowej lezacej w katalogu wyzej (../)

Ten post edytował joytec 19.03.2010, 10:13:36
Go to the top of the page
+Quote Post
Crozin
post
Post #6





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

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


Cytat
klasa w php

class a{

}

to jest klasa
... to może dosłownie: piszemy klasa, klasę, klasy, a nie classa, classę czy classa.

Cytat
i wlasnie o to chodzi zeby nie zmieniac takiej klasy w wileu zrodlach tylko zeby ja rozszerzyc
No to co za problem
  1. class Abc extends Def {...
Go to the top of the page
+Quote Post
joytec
post
Post #7





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


ja nie wiem czy czytales to co napisalem...

chce rozszerzyc klase a o b tylko ze b znajduje sie w katalogu nadrzednym (../) czy to mozliwe w ogole

poniewaz chcialbym zachowac rozmieszczenie w katalogach bo to poprostu przejzyste

Ten post edytował joytec 19.03.2010, 10:17:57
Go to the top of the page
+Quote Post
wookieb
post
Post #8





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




  1. require_once 'katalog/klasa_a.php';
  2. class b extends a
  3. {
  4.  
  5. }


--------------------
Go to the top of the page
+Quote Post
joytec
post
Post #9





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


albo jeszcze inaczej jesli rozszerzam klase a do b

class a extends b to czy klasa b rowniez przechodzi przez autoloader tzn czy moge ja umiescic w innym zrodle

Cytat(wookieb @ 19.03.2010, 10:18:41 ) *
  1. require_once 'katalog/klasa_a.php';
  2. class b extends a
  3. {
  4.  
  5. }



ja uzywam atoloadera
Go to the top of the page
+Quote Post
phpion
post
Post #10





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




Ciężko to sprawdzić samodzielnie?
Go to the top of the page
+Quote Post
wookieb
post
Post #11





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Jak ustawisz include path na katalogi w ktorych masz klasy to autoloader dolaczy je bez problemu


--------------------
Go to the top of the page
+Quote Post
joytec
post
Post #12





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


Cytat(phpion @ 19.03.2010, 10:23:59 ) *
Ciężko to sprawdzić samodzielnie?

no wlasnie sprawdzilem i nie dziala, ale moze robie blad i jest jakas inna fukcjonalnosc...

zawsze mozna dodac w katalogu klasy rozszerzajacej require z klasa bazowa

Ten post edytował joytec 19.03.2010, 10:32:50
Go to the top of the page
+Quote Post
wookieb
post
Post #13





Grupa: Moderatorzy
Postów: 8 989
Pomógł: 1550
Dołączył: 8.08.2008
Skąd: Słupsk/Gdańsk




Dobra to od początku.
Opowiem Ci o moim nawyku a ty sprawdzisz czy jest dobry czy nie.

Mam 2 katalogi
- application - klasy specyfikowane dla aplikacji
- classes - klasy dla kazdej aplikacji, silnik wiadomo

Zakladam include_page na katalog application i classes.
Wszystkie klasy główne trzymam w tych folderach. Klasy dodatkowe typu validatory, filtry obrazów, itd sa w podkatalogach ktora laduja inne klasy tylko wtedy kiedy potrzeba. __autoload swietnie sobie radzie z ladowaniem klas ktore znajduje sie na pierwszym poziomu katalogów application i classes, ponieważ są to najpotrzebniejsze klasy.

W twoim przypadku jeżeli nie chcesz miec zadnych require_onca powinienes zalozyc include_path na wszystkie katalogi ktore potrzebujesz, ale wiaze sie to z dwoma problemami. __autoload dziala wolniej bo musi te wszystkie katalogi przejrzec, musisz uwazac na nazwy plikow w "includowanych" katalogach, bo możesz otrzymać niespodziewane wyniki.


--------------------
Go to the top of the page
+Quote Post
joytec
post
Post #14





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 24.06.2005

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


Dziekuje za profi odpowiedz
Go to the top of the page
+Quote Post
starach
post
Post #15





Grupa: Zarejestrowani
Postów: 999
Pomógł: 30
Dołączył: 14.01.2007
Skąd: wiesz ?

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


To ja też dorzucę trochę swoich mOndrości. ;p

Chcesz dobry autoloader? Zainteresuj się przestrzeniami nazw w PHP 5.3. Możesz podejrzeć kod autoloadera w symfony 2.0, który z tego korzysta i jest właściwie największą siłą nowej wersji tego frameworka.

Albo zresztą żebyś nie musiał grzebać. ;p

  1. <?php
  2.  
  3. namespace Symfony\Foundation;
  4.  
  5. /*
  6.  * This file is part of the symfony package.
  7.  *
  8.  * (c) Fabien Potencier <fabien.potencier@symfony-project.com>
  9.  *
  10.  * For the full copyright and license information, please view the LICENSE
  11.  * file that was distributed with this source code.
  12.  */
  13.  
  14. /**
  15.  * ClassLoader implementation that implements the technical interoperability
  16.  * standards for PHP 5.3 namespaces and class names.
  17.  *
  18.  * Based on <a href="http://groups.google.com/group/php-standards/web/psr-0-final-proposal" target="_blank">http://groups.google.com/group/php-standar...-final-proposal</a>
  19.  *
  20.  * Example usage:
  21.  *
  22.  * [php]
  23.  * $loader = new ClassLoader();
  24.  * $loader->registerNamespace('Symfony', __DIR__.'/..');
  25.  * $loader->register();
  26.  *
  27.  * @author Jonathan H. Wage <jonwage@gmail.com>
  28.  * @author Roman S. Borschel <roman@code-factory.org>
  29.  * @author Matthew Weier O'Phinney <matthew@zend.com>
  30.  * @author Kris Wallsmith <kris.wallsmith@gmail.com>
  31.  * @author Fabien Potencier <fabien.potencier@symfony-project.org>
  32.  */
  33. class ClassLoader
  34. {
  35. protected $namespaces = array();
  36.  
  37. /**
  38.   * Creates a new loader for classes of the specified namespace.
  39.   *
  40.   * @param string $namespace The namespace to use
  41.   * @param string $includePath The path to the namespace
  42.   */
  43. public function registerNamespace($namespace, $includePath = null)
  44. {
  45. $this->namespaces[$namespace] = $includePath;
  46. }
  47.  
  48. /**
  49.   * Installs this class loader on the SPL autoload stack.
  50.   */
  51. public function register()
  52. {
  53. spl_autoload_register(array($this, 'loadClass'));
  54. }
  55.  
  56. /**
  57.   * Loads the given class or interface.
  58.   *
  59.   * @param string $className The name of the class to load
  60.   */
  61. public function loadClass($className)
  62. {
  63. $vendor = substr($className, 0, stripos($className, '\\'));
  64. if (!isset($this->namespaces[$vendor]))
  65. {
  66. return;
  67. }
  68.  
  69. if (false !== ($lastNsPos = strripos($className, '\\')))
  70. {
  71. $namespace = substr($className, 0, $lastNsPos);
  72. $className = substr($className, $lastNsPos + 1);
  73. $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace).DIRECTORY_SEPARATOR;
  74. }
  75. else
  76. {
  77. $namespace = '';
  78. $fileName = '';
  79. }
  80. $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className).'.php';
  81.  
  82. require $this->namespaces[$vendor].DIRECTORY_SEPARATOR.$fileName;
  83. }
  84. }
- Prostszego i wydajniejszego autoloadera to jeszcze nie widziałem...
Go to the top of the page
+Quote Post

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 Aktualny czas: 21.08.2025 - 13:00