Kaskadowe ładowanie klas

Kaskadowość większości ludzi związanymi z web developementem pewnie kojarzy się z kaskadowymi arkuszami styli (CSS). Jest to poniekąd słuszne skojarzenie, ponieważ daje pewne wyobrażenie czym ona jest.

W CSS-ach kaskadowość znaczy nie mniej, nie więcej tyle, że właściwości stylu zdefiniowane dla elementów wyżej w drzewie dokumentu propagują się w dół drzewa aż do momentu kiedy nie zostaną nadpisane przez właściwości elementów niżej w hierarchii.

W PHP istnieje technika oparta na podobnych założeniach, realizowana dzięki magicznej funkcji __autoload. Na czym więc polega ?

Załóżmy, że mamy pewną hierarchię klas:

--A

---B
----E

---C
----D
----E

Każda z tych klas dziedziczy bezpośrednio lub pośrednio z klasy A. Załóżmy teraz, że chcielibyśmy zmienić zachowanie wszystkich klas dziedziczących z A. Jednym z rozwiązań jest po prostu modyfikacja odpowiedniej metody z klasy A, jest to oczywiście najlepsze wyjście, z kilkoma wyjątkami, z których najpoważniejszym jest to, że klasa A należy do pewnej zewnętrznej biblioteki.

Klasycznym przykładem tego typu są formularze dziedziczące z Zend_Form. Mamy już gotowych n-bardzo dużo formularzy, jednak nagle okazało się, że trzeba im globalnie coś zmienić. Nie możemy za bardzo modyfikować samego Zend_Form-a ponieważ należy on do zewnętrznej biblioteki i w razie modyfikacji go, będzie problem z migracją do nowszych wersji frameworka.

Zmiana tych n-bardzo wielu klas, aby dziedziczyły z innej pośredniej klasy, która dziedziczy z Zend_Form będzie procesem bardzo pracochłonnym.

W tym momencie z pomocą przychodzi nam kaskadowość. Dzięki niej będziemy mogli podmienić oryginalną klasę Zend_Form, bez modyfikacji jej kodu.

Po pierwsze będzie nam potrzebna odpowiednia struktura katalogów:

-test_cascading
--base
---application
----forms
---library
----Zend
--modified
---library
----Zend

Naszą zmodyfikowaną klasę Zend_Form umieścimy w podkatalogu “modified” w takiej samej ścieżce jak w katalogu “base”.

Podczas ładowania naszych formularzy, które dziedziczą z Zend_Form, autoloader najpierw sprawdzi, czy istnieje plik z klasą w wersji zmodyfikowanej w katalogu “modified/library/Zend…” a gdy go nie ma, załaduje go z katalogu “base/library/Zend…”

Kod:

function __autoload($className){

$sPath = str_replace('_','/',$className).'.php';

$aCascade = array('modified/library','base/library');
foreach($aCascade as $branch){
    if(file_exists($branch.'/'.$sPath){
        require $branch.'/'.$sPath;
        return;
    }
}
}

Osobiście wykorzystuje kaskadowość również w innych celach. M.in gdy tworze w projekcie osobny branch na jakąś funkcjonalność, dokładam po prostu kolejny katalog w kaskadzie tylko z koniecznymi plikami, zamiast cały projekt branchować.

Na koniec jeszcze trzy słowa o wadach kaskadowości.

  • Po pierwsze, kaskadowość w pewnym stopniu spowalnia kod – więcej dostępów do dysku w zależności od długości kaskady. Dlatego w miarę możliwości należy jej używać tylko w środowisku developerskim.
  • Po drugie zbyt wiele plików w kaskadzie prowadzi do tego, że możemy się pogubić gdzie co w końcu było.

Jak widać więc, kaskadowe ładowanie klas jest mieczem obosiecznym i jak każdą rzecz należy stosować ją z umiarem.

P.S
z kaskadowości korzysta między innymi framework KOHANA.

  1. batman says:

    Jakoś mnie nie przekonałeś do tej idei. Zwłaszcza w kontekście ZF. Jeśli korzystam z rozwiązań, o których wiem, że będę je musiał rozszerzyć, pierwszą rzeczą jaką robię jest napisanie klasy (nawet pustej), która dziedziczy z klasy frameworka. Wówczas wspomniane nieprzewidziane modyfikacje wprowadzam w tej klasie. Oprócz dziedziczenia mamy jeszcze do dyspozycji kompozycję.

    Jakiś czas temu natknąłem się na implementację w PHP metod rozszerzeń z C# (extension methods), która pozwala na wstrzyknięcie do danego obiektu nowych metod. Niestety nie działa to zbyt szybko 😉

  2. Wojciech Soczyński says:

    Nie przekonuje nikogo do tej idei, po prostu ją przedstawiam, przydaje się w niektórych sytuacjach.

  3. Krzysiek says:

    Korzystam z kohany i uwazam ze wlasnie ta kaskadowosc jest duzym ulatwieniem przy tworzeniu kolejnego wdrozenia w oparciu o stary modul.

  4. Wojciech Soczyński says:

    Ja też uważam, że to świetna rzecz, dlatego warto by ludzie poznali tą technikę :)

  5. Global Dope Here this offshoot

  6. alanispat says:

    I’m an academic writer who loves to bring smiles to people’s face.

    Writing is what I do for a living and I am so passionate about this. I have worked with several companies whose mission is to help people solve writing problems.
    I love traveling and have visited several places in the past few years.
    I’m happy to have written several books that have contributed positively to the lives of many. My works are available in several parts of the world. And I’m currently working with service providers that help people save time. Being a part of this team has open more opportunities for me to excel as a writer. I have worked with different people and met many clients as a writer.
    I can handle any kind of writing project and provide nothing but the best. People come to me all the time to ask if I can solve their writing problems and I accept. I find pleasure in helping them to solve their problems as a writer.

    Professional Writer – Alanis Patton – Greaternewarkcharterschool Band

  7. Hi guys, it’s Victoria Patton here!
    I work as a professional an essay writer and have created this content with the intent of changing your life for the better. I started honing my writing skills in my school years. I learned that my fellow students needed writing help—and they were willing to pay for it. The money was enough to help pay my tuition for my remaining semesters of college.
    Ever since school, I have continued to work as a professional writer. I was hired by a writing company based in the United Kingdom. Since then, the essays that I have created have been sold around Europe and the United States.
    In my line of work, I have become used to hearing, “Victoria, can you help me meet my writing assignment deadline?” I know that I can save their time.

    Professional Writer – Victoria – A2zcareers Team

  8. Avalanchepvj says:

    ???????,??????????! .

  9. Holographicxen says:

    ???????,??????????! .

  10. Professionalcmi says:

    ???????,??????????! .

  11. Milwaukeegle says:

    ???????,??????????! .

  12. Bluetoothhul says:

    ???????,??????????! .

  13. taylormor says:

    Hello ,
    I’m Amber Crouch.
    If you’ve ever been too busy and couldn’t finish a research assignment , then you’ve come to the right place. I assist students in all areas of the writing technique. I can also write the essay from start to finish.
    My career as a professional writer started during high school. After learning that I was very capable in the field of academic writing, I decided to take it up as a job .

    Talented Academic Writer- Amber- Click here Corp

  14. lynseyvel says:

    My name is Lynsey Velasquez. And I am a professional academic writer with many years of experience in writing.

    My interest is to solve problems related to writing. And I have been doing it for many years. I have been with several organizations as a volunteer and have assisted clients in many ways.
    My love for writing has no end. It is like the air we breathe, something I cherish with all my being. I am a passionate writer who started at an early age.
    I’m happy that I`ve already sold several copies of my poems in different countries like Canada and China and others too numerous to mention.
    I also work in a company that provides assistance to many clients from different parts of the world. Clients always come to me because I work no matter how hard their projects are. I help them to save time, because I feel fulfilled when people come to me for writing help.

    Academic Writer – Lynsey Velasquez – Iseet-Papers Confederation

  1. There are no trackbacks for this post yet.

Leave a Reply

Notify me of followup comments via e-mail. You can also subscribe without commenting.