Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Rozszerzanie klas
Forum PHP.pl > Forum > PHP > Object-oriented programming
joytec
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
Crozin
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ł.
joytec
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
phpion
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.
joytec
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 (../)
Crozin
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 {...
joytec
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
wookieb
  1. require_once 'katalog/klasa_a.php';
  2. class b extends a
  3. {
  4.  
  5. }
joytec
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
phpion
Ciężko to sprawdzić samodzielnie?
wookieb
Jak ustawisz include path na katalogi w ktorych masz klasy to autoloader dolaczy je bez problemu
joytec
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
wookieb
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.
joytec
Dziekuje za profi odpowiedz
starach
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...
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-2024 Invision Power Services, Inc.