Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ PHP _ Class not found

Napisany przez: damianooo 18.09.2018, 10:53:47

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. http://www.php.net/echo "TEST połączenia w protokole STOMP";
  10. http://www.php.net/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 ?



Napisany przez: Pyton_000 18.09.2018, 11:00:47

$stomp = new \Stomp\Client("tcp://localhost:8080");

Napisany przez: damianooo 18.09.2018, 11:30:58

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. http://www.php.net/echo "TEST połączenia w protokole STOMP";
  5. http://www.php.net/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

Napisany przez: Pyton_000 18.09.2018, 11:56:43

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

Napisany przez: damianooo 18.09.2018, 12:05:59

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ż.

Napisany przez: Pyton_000 18.09.2018, 12:29:35

Zainstaluj composer https://getcomposer.org
dołącz plik `vendor/autoload.php` do swojego pliku i zainstaluj tą libkę tak jak jest opisane na GitHub

Napisany przez: damianooo 18.09.2018, 19:50:50

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

Napisany przez: Pyton_000 18.09.2018, 20:18:03

  1. <?php
  2.  
  3. function autoload($className)
  4. {
  5. $className = http://www.php.net/ltrim($className, '\\');
  6. $fileName = '';
  7. $namespace = '';
  8. if ($lastNsPos = http://www.php.net/strrpos($className, '\\')) {
  9. $namespace = http://www.php.net/substr($className, 0, $lastNsPos);
  10. $className = http://www.php.net/substr($className, $lastNsPos + 1);
  11. $fileName = http://www.php.net/str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  12. }
  13. $fileName .= http://www.php.net/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");

Napisany przez: damianooo 18.09.2018, 20:38:01

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/Automatyczne_%C5%82adowanie

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

  1. function myClassLoader($className){
  2. http://www.php.net/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


Napisany przez: Pyton_000 19.09.2018, 12:30:04

No masz błędy wyraźne teraz musisz sobie poprawić to. Debuguj, sprawdzaj

Napisany przez: damianooo 19.09.2018, 22:02:47

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 ?

Napisany przez: Pyton_000 20.09.2018, 07:47:29

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


Napisany przez: damianooo 20.09.2018, 08:29:21

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();

Napisany przez: kapslokk 20.09.2018, 08:35:27

Pokaz jeszcze w calosci ten swoj plik stomp.php

Napisany przez: Pyton_000 20.09.2018, 08:43:47

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...

Napisany przez: damianooo 20.09.2018, 14:22:50

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.


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)