2017-04-18 4 views
2

Ich habe folgende Struktur, wie man Symfony Class Loader verwenden

api

gemeinsamen

Config

docs

Skripte

Anbieter

Ich habe benutzerdefinierte Autoloader unter common/php/autoload.php die

<?php 
require_once BASE_DIR . 'vendor/autoload.php'; 
require_once BASE_DIR . 'vendor/symfony/class-loader/ClassLoader.php'; 

use Symfony\ClassLoader\ClassLoader; 

$loader = new \ClassLoader(); 

// to enable searching the include path (eg. for PEAR packages) 
$loader->setUseIncludePath(true); 

// ... register namespaces and prefixes here - see below 

$loader->register(); 

// register a single namespaces 
$loader->addPrefix('CCP', BASE_DIR . 'common/ccp/'); 


// cache files locations 
require_once BASE_DIR . 'vendor/symfony/class-loader/ApcClassLoader.php'; 

// sha1(__FILE__) generates an APC namespace prefix 
$cachedLoader = new ApcClassLoader(sha1(__FILE__), $loader); 

// register the cached class loader 
$cachedLoader->register(); 

// deactivate the original, non-cached loader if it was registered previously 
$loader->unregister(); 

enthält Wie Sie Komponist stellt alles unter ROOTDIR/Kreditoren Ordner kann wissen.

Error I get is Fatal error: Uncaught Error: Class 'ClassLoader' not found in ROOTDIR/common/php/autoload.php:7 

UPDATE

Wenn ich versuche, meine eigene Klasse unter gemeinsamer zu laden/ccp es wird nicht geladen.

Fatal error: Uncaught Error: Class 'CCP\Notification' not found in ROOTDIR/scripts/cli-test-email.php:12 

Inhalt der Klasse

<?php 
namespace CCP 

class Notification{ 
... 
} 

UPDATE 2

Meine Skripte ist unter script Ordner. Wenn ich den use hinzufüge, tut es kein Fehler, aber nichts geschieht in Bezug auf Echo oder irgendwelche Fehler. Wenn ich das use entferne, findet es die Klasse Notification nicht.

#!/opt/SP/php-7.0.10/bin/php -q 
<?php 
ini_set('display_startup_errors', 1); 
ini_set('display_errors', 1); 
error_reporting(E_ALL|E_STRICT); 
echo "before use"; 
use CCP/Notification; 
echo "after use"; 

$notification = new Notification(); 

print_r($notification); 
$notification->emailTest(); 
+0

'$ loader = new Symfony \ Komponente \ ClassLoader \ ClassLoader' – Federkun

+0

Warum muss ich' Symfony \ Component \ ClassLoader \ 'einschließen? – shorif2000

+0

Dinge, die Sie vielleicht nachschlagen möchten: wie Namespaces funktioniert und was ist psr-0/4 – Federkun

Antwort

1

Indtead dafür:

use Symfony\ClassLoader\ClassLoader; 

$loader = new \ClassLoader(); 

Sie sollten entweder tun:

$loader = new Symfony\ClassLoader\ClassLoader(); 

oder:

use Symfony\ClassLoader\ClassLoader; 

$loader = new ClassLoader(); //no backslash at the begining 

Wenn Sie einen umgekehrten Schrägstrich vor Klassennamen setzen, es bedeutet der Root-Namespace, also ist es nicht mattiert r, dass Sie vorher use setzen, weil es hier nicht verwendet wird.

Als Beispiel nehmen wir an, Sie haben zwei Klassen mit dem gleichen Namen SomeClass. Einer von ihnen ist unter Root-Namespace, und die andere ist unter Some/Namespace/SomeClass

Jetzt:

use Some/Namespace/SomeClass; 

$object1 = new SomeClass(); //this is Some/Namespace/SomeClass instace 
$object2 = new \SomeClass(); //this is SomeClass from root namespace. 

EDIT:

Was Ihre Frage in Ihrer aktualisierten Frage - es zu Fall in Zusammenhang stehen können Empfindlichkeit. Versuchen Sie, dass Ihre Verzeichnisnamen mit dem Namespace übereinstimmen, einschließlich der Groß-/Kleinschreibung.

+0

Ich umbenannte common/ccp in common/CCP aber immer noch das gleiche Problem – shorif2000

+0

Bitte siehe Update 2 – shorif2000

+1

Ich konnte dies nicht zur Arbeit, und ich sehe Symfony Autoload wird abgeschrieben, so dass ich Komponist verwendet, die für mich funktioniert http: // jessesnet.com/development-notes/2014/php-composer-autoloading/ – shorif2000

Verwandte Themen