2016-04-07 8 views
-2

Ich versuche, Namespaces und sind in PHP zu verstehen, und kam mit einem Beispiel, die wie folgt aussieht:PHP, Namespaces verwenden und umfassen - einfaches Beispiel Fehler

$ tree test/class/ 
test/class/ 
├── Bar.php 
└── testin.php 

Hier sind die bash Befehle I bin läuft das Beispiel einzurichten:

mkdir -p test/class 

cat > test/class/Bar.php <<EOF 
<?php 
namespace Foo; 
class Bar { 
    function __construct() { // php 5 constructor 
    print "In Bar constructor\n"; 
    } 
    public function Bar() { // php 3,4 constructor 
    echo "IT IS Bar\n"; 
    } 
} 
?> 
EOF 

cat > test/class/testin.php <<EOF 
<?php 
use Foo; 
require_once (__DIR__ . '/Bar.php'); 
$bar = new Bar(); 
?> 
EOF 

pushd test/class 
php testin.php 
popd 

Und wenn ich diese laufen erhalte ich:

+ php testin.php 
PHP Warning: The use statement with non-compound name 'Foo' has no effect in /tmp/test/class/testin.php on line 2 
PHP Parse error: syntax error, unexpected '=' in /tmp/test/class/testin.php on line 4 

Ok, so Wie könnte ich dieses Beispiel ändern, so dass es testin.php liest die Klasse in Bar.php und instanziiert ein Objekt aus, während use und Namespaces verwenden?


EDIT: Die zweite Datei Setup die "EOF" zitiert haben sollte, wegen der Anwesenheit von Dollarzeichen $:

cat > test/class/testin.php <<"EOF" 
<?php 
use Foo; 
require_once (__DIR__ . '/Bar.php'); 
$bar = new Bar(); 
?> 
EOF 

... dann gibt die PHP-Skripte laufen den Fehler:

+ php testin.php 
PHP Warning: The use statement with non-compound name 'Foo' has no effect in /tmp/test/class/testin.php on line 2 
PHP Fatal error: Class 'Bar' not found in /tmp/test/class/testin.php on line 4 

EDIT2: Wenn ich declare the full path, beginning with \ which signifies the root namespace, dann funktioniert es:

cat > test/class/testin.php <<"EOF" 
<?php 
use \Foo; 
require_once (__DIR__ . '/Bar.php'); 
$bar = new \Foo\Bar(); 
?> 
EOF 

... dann alles funktioniert:

+ php testin.php 
In Bar constructor 

... aber dann, was ist der Punkt, von use, wenn ich den vollständigen Namespace-Pfad zu wiederholen, wenn $bar = new \Foo\Bar(); tun? (Wenn ich nicht ausdrücklich \Foo\Bar() schreiben, dann wird die Klasse Bar kann nicht gefunden werden ...)

+1

Warum die Bash-Befehle und nicht nur die PHP-Quelle? Und warum sollte man die Korrektur in einen Anhang schreiben und den Code nicht direkt ändern? Das macht alles sehr ausführlich und unklar. – syck

+0

Danke @syck - Die 'bash'-Befehle sind da, damit die Leser hier genau rekonstruieren können, was ich tue, denke ich. Und ich habe Korrekturen im Anhang hinzugefügt, damit man verfolgen kann, was meine Fehler sind - ich hatte es schwer zu finden ein Beispiel, das das erklärt, also denke ich, dass es nützlich ist, zu notieren, wo man schief gehen kann ... Prost! – sdaau

+1

Ich denke, was Sie herausfinden wollen, ist, dass Sie den 'Namespace'-Operator sowohl in der aufrufenden als auch in der aufgerufenen Klasse verwenden müssen. 'use' definiert Aliase. – syck

Antwort

0

wenn Sie use Foo\Bar; in Ihrer testin.php Datei zu verwenden, dann können Sie $bar = new Bar(); direkt verwenden.

wenn Sie $bar = new Foo\Bar(); verwenden, brauchen Sie nicht use ...

hinzufügen Da use Foo bedeutet nur, den Namensraum (in Ihrem Fall bedeutet es, den Ordner ‚Klasse‘), wenn Sie wollen, es entspricht eine benannte Datei, sollten Sie Fügen Sie den Namen der Datei hinzu.