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