Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Class not found, Problem z dostępem do klas
damianooo
post 18.09.2018, 10:53:47
Post #1





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


Mój skrypt nie widzi klas i rzuca następującym błędem:
  1. Fatal error: Class 'Client' not found in C:\VertrigoServ\www\Stomp\stomp.php on line ...


mój skrypt stomp.php:

  1. // include a library
  2. require_once("src\Client.php");
  3. require_once("src\SimpleStomp.php");
  4. require_once("src\Protocol\Protocol.php");
  5. require_once("src\Protocol\Version.php");
  6. require_once("src\Transport\Frame.php");
  7. require_once("src\Transport\Message.php");
  8.  
  9. echo "TEST połączenia w protokole STOMP";
  10. echo "<br />";
  11.  
  12. // make a connection
  13. $stomp = new Client("tcp://localhost:8080");


Struktura katalogów jest taka:

Stomp/stomp.php
Stomp/src/Client.php

Klasa Client.php:

  1. namespace Stomp;
  2.  
  3. use Stomp\Exception\ConnectionException;
  4. use Stomp\Exception\MissingReceiptException;
  5. use Stomp\Exception\StompException;
  6. use Stomp\Exception\UnexpectedResponseException;
  7. use Stomp\Network\Connection;
  8. use Stomp\Protocol\Protocol;
  9. use Stomp\Protocol\Version;
  10. use Stomp\Transport\Frame;
  11.  
  12. /**
  13.  * Stomp Client
  14.  *
  15.  * This is the minimal implementation of a Stomp Client, it allows to send and receive Frames using the Stomp Protocol.
  16.  *
  17.  * @package Stomp
  18.  * @author Hiram Chirino <hiram@hiramchirino.com>
  19.  * @author Dejan Bosanac <dejan@nighttale.net>
  20.  * @author Michael Caplan <mcaplan@labnet.net>
  21.  * @author Jens Radtke <swefl.oss@fin-sn.de>
  22.  */
  23. class Client
  24. {
  25. /**
  26.   * Perform request synchronously
  27.   *
  28.   * @var boolean
  29.   */
  30. private $sync = true;


PS. Używam serwera www VertrigoServ z wersją PHP 5.6 bo taka jest potrzebna mi do przetestowania protokołu STOMP.


Dlaczego nie widzi mi tej klasy ?


Go to the top of the page
+Quote Post
Pyton_000
post 18.09.2018, 11:00:47
Post #2





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

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


$stomp = new \Stomp\Client("tcp://localhost:8080");
Go to the top of the page
+Quote Post
damianooo
post 18.09.2018, 11:30:58
Post #3





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


przeniosłem skrypt do katalogu "src" i teraz mam tak w skrypcie stomp.php :

  1. // include a library
  2. require_once("Client.php");
  3.  
  4. echo "TEST połączenia w protokole STOMP";
  5. echo "<br />";
  6.  
  7. // make a connection
  8. $stomp = new \Stomp\Client("tcp://localhost:8080");



i komunikat :

  1. Fatal error: Class 'Stomp\Protocol\Version' not found in C:\VertrigoServ\www\Stomp\src\stomp.php on line 10


dziwne bo linia 10 to to:
  1. $stomp = new \Stomp\Client("tcp://localhost:8080");


ale rozumiem że idzie do pliku Client.php i tam ma problem z tym:

  1. namespace Stomp;
  2. use Stomp\Protocol\Version;


więc zmieniam na:

  1. use Stomp\src\Protocol\Version


i dostaję właściwie to samo bo:

  1. Fatal error: Class 'Stomp\src\Protocol\Version' not found in C:\VertrigoServ\www\Stomp\src\stomp.php on line 10


Ten post edytował damianooo 18.09.2018, 11:31:41
Go to the top of the page
+Quote Post
Pyton_000
post 18.09.2018, 11:56:43
Post #4





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

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


A po co cokolwiek przenosiłeś? Miało zostać tak jak miałeś i tylko zmienić tą 1 rzecz.

Nie używasz autoloadera więc każdą klasę która jest używana musi być dołączona
Go to the top of the page
+Quote Post
damianooo
post 18.09.2018, 12:05:59
Post #5





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


też tak robiłem ale i tak był kolejny błąd taki jak pisałem w ostatnim poście.

Wyciąłem teraz kod z klasami z katalogu "src" i zapisałem na serwerze www w katalogu "Stomp" i tam też jest mój skrypt.

Mam teraz tak jak poniżej i wydaje się że w końcu po Bożemu

  1. www/Stomp/stomp.php
  2. www/Stomp/Client.php
  3. www/Stomp/Protocol/Version.php
  4. itd.



Generalnie wziąłem kody stąd:
  1. https://github.com/stomp-php/stomp-php


Nadal mam jednak ten sam błąd:
  1. Fatal error: Class 'Stomp\Protocol\Version' not found in C:\VertrigoServ\www\Stomp\stomp.php on line 10


PS. A żeby mieć autoloadera to co powinienem zrobić ? Bo piszesz że każda klasa musi być dołączona to oznacza że każdą muszę przejrzeć i zmieniać , masakra i bez sensu przecież.
Go to the top of the page
+Quote Post
Pyton_000
post 18.09.2018, 12:29:35
Post #6





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

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


Zainstaluj composer https://getcomposer.org
dołącz plik `vendor/autoload.php` do swojego pliku i zainstaluj tą libkę tak jak jest opisane na GitHub
Go to the top of the page
+Quote Post
damianooo
post 18.09.2018, 19:50:50
Post #7





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


Jednak nie wchodzi w grę autoloader i composer ze względów polityki firmy ale nie ważne ..

Próbuję to zrobić bez tego i tak:
Mam taką strukturę katalogów:
  1. www/Stomp/stomp.php (to jest mój skrypt)
  2. www/Stomp/Client.php
  3. www/Stomp/Protocol/Version.php
  4. itd.


Mój skrypt jest taki:

  1. require_once("Client.php");
  2. $stomp = new \Stomp\Client("tcp://localhost:8080");


Klasa Client.php tak ma ustawione namespace i ścieżki do innych klas:

  1. namespace Stomp;
  2.  
  3. ...
  4. use Stomp\Exception\UnexpectedResponseException;
  5. use Stomp\Network\Connection;
  6. ...
  7. class Client
  8. {
  9. ...
  10. private $versions = [Version::VERSION_1_0, Version::VERSION_1_1, Version::VERSION_1_2];
  11. ...
  12. if ($frame = $this->getConnectedFrame()) {
  13. $version = new Version($frame);
  14. ...


i mam taki błąd:

  1. Fatal error: Class 'Stomp\Protocol\Version' not found in C:\VertrigoServ\www\Stomp\stomp.php on line 4


Dlaczego wciąż dostaję informację że nie ma takiej klasy w tym katalogu ?
Jak to powinienem mieć ?
Proszę o podpowiedź to pozostałe sobie już pozmieniam.

Dzięki

Ten post edytował damianooo 18.09.2018, 19:55:12
Go to the top of the page
+Quote Post
Pyton_000
post 18.09.2018, 20:18:03
Post #8





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

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


  1. <?php
  2.  
  3. function autoload($className)
  4. {
  5. $className = ltrim($className, '\\');
  6. $fileName = '';
  7. $namespace = '';
  8. if ($lastNsPos = strrpos($className, '\\')) {
  9. $namespace = substr($className, 0, $lastNsPos);
  10. $className = substr($className, $lastNsPos + 1);
  11. $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  12. }
  13. $fileName .= str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
  14.  
  15. require $fileName;
  16. }
  17. spl_autoload_register('autoload');
  18.  
  19.  
  20. $stomp = new \Stomp\Client("tcp://localhost:8080");
Go to the top of the page
+Quote Post
damianooo
post 18.09.2018, 20:38:01
Post #9





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


hmm , a więc da się to też tak zrobić ok ...

ale użyłem Twojego kodu i mam takie dwa błędy więc coś jeszcze nie tak:

  1. Warning: require(Stomp\Client.php): failed to open stream: No such file or directory in C:\VertrigoServ\www\Stomp\stomp.php on line 15

i
  1. Fatal error: require(): Failed opening required 'Stomp\Client.php' (include_path='.;C:\VertrigoServ\Smarty') in C:\VertrigoServ\www\Stomp\stomp.php on line 15



doczytałem trochę o autładowaniu klas:
https://pl.wikibooks.org/wiki/PHP/Automatyc..._%C5%82adowanie

i widzę że można kod skrócić nawet do tego:

  1. function myClassLoader($className){
  2. echo 'Ładuję klasę '.$className.'<br/>';
  3. require('./'.$className.'.php');
  4. // Zwróć "true", informując, że klasa została znaleziona.
  5. return true;
  6.  
  7. } // end myClassLoader();
  8.  
  9. spl_autoload_register('myClassLoader');
  10.  
  11. $stomp = new \Stomp\Client("tcp://localhost:8080");


tylko że co ciekawe ciągle mam te dwa powyższe błędy sad.gif ... masakra



Ten post edytował damianooo 18.09.2018, 20:57:15
Go to the top of the page
+Quote Post
Pyton_000
post 19.09.2018, 12:30:04
Post #10





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

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


No masz błędy wyraźne teraz musisz sobie poprawić to. Debuguj, sprawdzaj
Go to the top of the page
+Quote Post
damianooo
post 19.09.2018, 22:02:47
Post #11





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


ok udało mi się composerem zainstalować tą bibliotekę.
composer install wykonałem z katalogu na który wskazuje PATH systemowy a więc z c:\ProgramData\ComposerSetup\bin\
Teraz mam tam katalog vendor a w nim katalog composer , katalog z biblioteką stomp-php oraz plik autoload.php

Skopiowałem więc cały katalog vendor do mojego projektu na serwerze www a więc do c:\VertrigoServ\www\dc\ , umieściłem w nim mój skrypt stomp.php , który teraz ma jedną linię kodu:

  1. $stomp = new Client("tcp://localhost:8080");


i dostaję błąd:

  1. Fatal error: Class 'Client' not found in C:\VertrigoServ\www\dc\stomp.php on line 3


strukturę katalogów mam teraz taką :

  1. c:\VertrigoServ\www\dc\vendor
  2. c:\VertrigoServ\www\dc\vendor\composer
  3. c:\VertrigoServ\www\dc\vendor\stomp-php
  4. c:\VertrigoServ\www\dc\vendor\stomp-php\stomp-php
  5. c:\VertrigoServ\www\dc\vendor\stomp-php\stomp-php\src
  6. c:\VertrigoServ\www\dc\vendor\stomp-php\stomp-php\src\Client.php
  7. c:\VertrigoServ\www\dc\vendor\autoload.php
  8. c:\VertrigoServ\www\dc\stomp.php


co mam źle ?

Ten post edytował damianooo 19.09.2018, 22:03:48
Go to the top of the page
+Quote Post
Pyton_000
post 20.09.2018, 07:47:29
Post #12





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

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


Cytat(Pyton_000 @ 18.09.2018, 13:29:35 ) *
dołącz plik `vendor/autoload.php` do swojego pliku

Go to the top of the page
+Quote Post
damianooo
post 20.09.2018, 08:29:21
Post #13





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


ok tak zrobiłem i mam teraz tak jak pisałeś a więc:

  1. c:\VertrigoServ\www\dc\Protocol
  2. c:\VertrigoServ\www\dc\Network
  3. c:\VertrigoServ\www\dc\Client.php
  4. c:\VertrigoServ\www\dc\autoload.php
  5. c:\VertrigoServ\www\dc\stomp.php


i nadal mam ten sam błąd:

  1. Fatal error: Class 'Client' not found in C:\VertrigoServ\www\dc\stomp.php on line 3


plik autoload.php wygląda tak:

  1. // autoload.php @generated by Composer
  2. require_once __DIR__ . '/composer/autoload_real.php';
  3. return ComposerAutoloaderIniteedd29babb5302c6f0ff68b11e9edd49::getLoader();


Ten post edytował damianooo 20.09.2018, 08:30:24
Go to the top of the page
+Quote Post
kapslokk
post 20.09.2018, 08:35:27
Post #14





Grupa: Zarejestrowani
Postów: 965
Pomógł: 285
Dołączył: 19.06.2015
Skąd: Warszawa

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


Pokaz jeszcze w calosci ten swoj plik stomp.php
Go to the top of the page
+Quote Post
Pyton_000
post 20.09.2018, 08:43:47
Post #15





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

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


sciana.gif

Tłumaczę ostatni raz... Więcej nie będę.

1. Utwórz katalog
2. zainstalu composera
3. W poprzednio wykonanym katalogu uruchom `composer require stomp-php/stomp-php`
4. utwórz plik stomp.php:

  1. <?php
  2.  
  3. include 'vendor/autoload.php';
  4.  
  5. $stomp = new \Stomp\Client("tcp://localhost:8080");


I Tyle...
Go to the top of the page
+Quote Post
damianooo
post 20.09.2018, 14:22:50
Post #16





Grupa: Zarejestrowani
Postów: 493
Pomógł: 2
Dołączył: 15.07.2011
Skąd: Katowice

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


ok działa dzięki.
Sorry za głupie pytania ... po prostu za dużo nie używałem composera.
W sumie miałem "prawie" smile.gif dobrze ...
Instalowałem po prostu libkę w innym miejscu i całość później przeniosłem.
Poza tym w kodzie w wywołaniu klasy Client nie podałem dokładnej ścieżki i nie zaincludowałem autoloadera sad.gif ...

Dzięki raz jeszcze za pomoc.

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: 28.03.2024 - 11:23