Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Symulowanie klasy, autoloader class_alias rozwiązaniem problemu :)
Tomplus
post 16.11.2016, 22:37:03
Post #1





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Witam,

Gdy klasa nie istnieje mamy komunikat FATAL ERROR, a jak zrobić aby symulować istnienie klasy która nie istnieje?

Mam taką metodę, ale po wielu dziwnych próbach nic nie udało mi się wskórać. A błąd nadal jest. Wg przykładu poniżej Mam komunikat z wyjątku + Fatal Error parsera.
  1. public function loadClass($class) {
  2. try {
  3. $class = $this->explodeClass($class);
  4. $file = $this->fileExists($this->rootdir.'/'.$class -> src, $class -> name);
  5. if($file) {
  6. $this->requireFile($file);
  7. $this->loaded_classes[$class -> name] = $file;
  8. } else {
  9. throw new \Exception("Klasa nie istnieje: ". $class -> name);
  10. }
  11. } catch (\Exception $exception) {
  12. echo $exception->getMessage();
  13. }
  14. }


Ten post edytował Tomplus 17.11.2016, 09:42:23
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
SmokAnalog
post 16.11.2016, 22:49:40
Post #2





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Nie rozumiem. Dlaczego i w jaki sposób chciałbyś "symulować, że klasa istnieje"? W jaki sposób obsłużysz obiekty tej nieistniejącej klasy?
Go to the top of the page
+Quote Post
Tomplus
post 16.11.2016, 23:00:30
Post #3





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Brak obiektów to inny problem, ale do rozwiązania. Ale istnieją jeszcze magiczne metody, i dzięki nim własności zwracałyby domyślnie false.
Po co? Właśnie po to aby dać informację parserowi że klasa istnieje, a dalej ma kontynuować stronę.

Go to the top of the page
+Quote Post
Spawnm
post 16.11.2016, 23:03:31
Post #4





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




Może w autoload daj na dziko eval('class '.$x.' extends foo {}');
Ani to ładne, ani bezpieczne, ale co tam ;D

Można taż new stdClass jeśli klasa będzie brana tylko z kontenera
Go to the top of the page
+Quote Post
SmokAnalog
post 16.11.2016, 23:05:29
Post #5





Grupa: Zarejestrowani
Postów: 1 707
Pomógł: 266
Dołączył: 3.07.2012
Skąd: Poznań

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


Albo zamiast tego paskudnego (w tym przypadku) eval jest jeszcze class_alias. Ale mam niemal 100% pewności, że coś tam rozrabiasz haha.gif

  1. class FakeClass {}
  2.  
  3. function __autoload($className) {
  4. class_alias('FakeClass', $className);
  5. }
  6.  
  7. $dog = new Animal;
  8. print_r($dog);
  9.  
  10. // Output: FakeClass Object ( )


Ten post edytował SmokAnalog 16.11.2016, 23:26:27
Go to the top of the page
+Quote Post
Pyton_000
post 17.11.2016, 08:32:24
Post #6





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Pokaz output błędu
Go to the top of the page
+Quote Post
Tomplus
post 17.11.2016, 09:40:44
Post #7





Grupa: Zarejestrowani
Postów: 1 873
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


Podziękowanie dla Smoka, najlepsze że byłem wczoraj w manualu, kręciłem się koło class_alias, ale nie wpadłem na to żeby wejść na tą funkcję biggrin.gif

Ogólnie mówiąc efekt jest taki jaki chcę, teraz tylko rozwijać dalej.

Użyłem:
  1. class_alias ( 'FakeClass', $class -> name);


a dalej, stworzyłem plik z ów klasą, dzięki temu odwoływanie do metod i własności nie powodują błędu.

  1. class FakeClass{
  2. public function __get($p) {
  3. return false;
  4. }
  5.  
  6. public function __call($p, $q) {
  7. return false;
  8. }
  9. }

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 Wersja Lo-Fi Aktualny czas: 15.06.2025 - 05:17