"A file containing a namespace must declare the namespace at the top of the file before any other code"
It might be obvious, but this means that you *can* include comments and white spaces before the namespace keyword.
<?php
// Lots
// of
// interesting
// comments and white space
namespace Foo;
class Bar {
}
?>
名前空間の定義
PHP のコードならなんでも名前空間に含めることができますが、 実際に名前空間の影響を受けるのはクラスと関数そして定数の 3 種類だけです。
名前空間を宣言するには、キーワード namespace を使用します。名前空間を含むファイルでは、他のコードより前にファイルの先頭で名前空間を宣言しなければなりません。 ただし declare キーワードは例外です。
例1 名前空間の宣言
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
名前空間の宣言より前に書くことが許されているコードは declare 文のみです。ソースファイルのエンコーディングを定義するために使用します。 さらに、PHP コード以外であっても名前空間の宣言の前に記述することはできません (スペースも同様です)。
例2 名前空間の宣言
<html>
<?php
namespace MyProject; // fatal error - namespace must be the first statement in the script
?>
さらに、他の PHP の制御構造とは異なり、同一の名前空間を複数のファイルで定義することができます。 これにより、ひとつの名前空間の内容をファイルシステム上で分割することができます。
名前空間の定義
huskyr at gmail dot com
05-Oct-2009 11:20
05-Oct-2009 11:20
jurrien at jpdokter dot nl
04-Aug-2009 08:21
04-Aug-2009 08:21
I have written a Packager class that allows to use packages and namespaces. It does require the folder layout. If the __autoload function is not yet "re-implemented", it'll create its own __autoload function.
It is written in PHP5 and does not require > PHP5.3, moreover, I don't have PHP5.3 since XAMPP is not adding it yet. Don't ask me why.
Since it's over 300 lines long, I am not going to post it here. But if someone would like to have a look?
Basic uses:
<?php
# /classes
# /package1
# class34.class.php
# /package2
# classone.class.php
require_once('packager.class.php');
#Packager::debug(true);
Packager::addClasspath(dirname(__FILE__).'/classes', true); // true means that it overrules the predefined set.
Packager::addClassSuffix(array('.class.php'),true); // true means that it overrules the predefined set.
Packager::import("package1.Class34"); // java-style
Packager::import("package2::ClassOne"); // php-style
echo Packager::dump(); // show us what you got!
?>
jeremeamia at gmail dot com
14-Jul-2009 03:43
14-Jul-2009 03:43
You should not try to create namespaces that use PHP keywords. These will cause parse errors.
Examples:
<?php
namespace Project/Classes/Function; // Causes parse errors
namespace Project/Abstract/Factory; // Causes parse errors
?>
danbettles at yahoo dot co dot uk
14-Apr-2009 07:02
14-Apr-2009 07:02
Regarding constants defined with define() inside namespaces...
define() will define constants exactly as specified. So, if you want to define a constant in a namespace, you will need to specify the namespace in your call to define(), even if you're calling define() from within a namespace. The following examples will make it clear.
The following code will define the constant "MESSAGE" in the global namespace (i.e. "\MESSAGE").
<?php
namespace test;
define('MESSAGE', 'Hello world!');
?>
The following code will define two constants in the "test" namespace.
<?php
namespace test;
define('test\HELLO', 'Hello world!');
define(__NAMESPACE__ . '\GOODBYE', 'Goodbye cruel world!');
?>
David Drakard
07-Sep-2008 12:56
07-Sep-2008 12:56
I agree with SR, the new namespaces feature has solved a number of problems for me which would have required horrible coding to solve otherwise.
An example use:
Say you are making a small script, and write a class to connect to a database, calling it 'connection'. If you find your script useful and gradually expand it into a large application, you may want to rename the class. Without namespaces, you have to change the name and every reference to it (say in inheriting objects), possibly creating a load of bugs. With namespaces you can drop the related classes into a namespace with one line of code, and less chance of errors.
This is by no means one of the biggest problems namespaces solve; I would suggest reading about their advantages before citicising them. They provide an elegant solutions to several problems involved in creating complex systems.
Baptiste
14-May-2008 07:47
14-May-2008 07:47
There is nothing wrong with PHP namespaces, except that those 2 instructions give a false impression of package management.
... while they just correspond to the "with()" instruction of Javascript.
By contrast, a package is a namespace for its members, but it offers more (like deployment facilities), and a compiler knows exactly what classes are in a package, and where to find them.
Anonymous
01-Apr-2008 07:11
01-Apr-2008 07:11
@ RS: Also, you can specify how your __autoload() function looks for the files. That way another users namespace classes cannot overwrite yours unless they replace your file specifically.
