我读了一篇关于namespaces
PHP 的文章。但我不明白它们的用途是什么?
<?php
namespace MyProject {
// Regular PHP code goes here, anything goes!
function run()
{
echo 'Running from a namespace!';
}
}
我还阅读了有关它的 PHP.net 手册,但不太明白。
我读了一篇关于namespaces
PHP 的文章。但我不明白它们的用途是什么?
<?php
namespace MyProject {
// Regular PHP code goes here, anything goes!
function run()
{
echo 'Running from a namespace!';
}
}
我还阅读了有关它的 PHP.net 手册,但不太明白。
我也度过了一段艰难的时光,只是把它看作是帮助编译器解析名称的一种方式。所以没有歧义。
您可以让两个开发人员编写完全不同的类但具有相同的类型标识符。类名可以相同。命名空间中的分组有助于编译器/解释器消除歧义。
所以namespace Developer1.CoolClass
与namespace Developer2.CoolClass
在 PHP 世界中,命名空间旨在解决库和应用程序的作者在创建可重用代码元素(如类或函数)时遇到的两个问题:
您创建的代码与内部 PHP 类/函数/常量或第三方类/函数/常量之间的名称冲突。能够为 Extra_Long_Names 起别名(或缩短)旨在缓解第一个问题,提高源代码的可读性。
PHP 命名空间提供了一种对相关类、接口、函数和常量进行分组的方法。
命名空间是一种将相关类分组到包中的方法。您可以将命名空间假设为保存文件的文件夹,这样两者都可以拥有同名但不同(或相同)的文件,而不会产生任何歧义。
文件1.php
<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{
static function staticmethod() {}
}
?>
文件2.php
<?php
namespace Foo\Bar;
include 'file1.php';
const FOO = 2;
function foo() {}
class foo
{
static function staticmethod() {}
}
/* Unqualified name */
foo(); // resolves to function Foo\Bar\foo
foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo FOO; // resolves to constant Foo\Bar\FOO
/* Qualified name */
subnamespace\foo(); // resolves to function Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // resolves to class Foo\Bar\subnamespace\foo,
// method staticmethod
echo subnamespace\FOO; // resolves to constant Foo\Bar\subnamespace\FOO
/* Fully qualified name */
\Foo\Bar\foo(); // resolves to function Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // resolves to class Foo\Bar\foo, method staticmethod
echo \Foo\Bar\FOO; // resolves to constant Foo\Bar\FOO
?>
命名空间用于隔离函数和类声明,以使库和“帮助程序”(包含函数的文件)更具可移植性。通过将库放在名称空间中,您可以减少您的类名与可能想要使用您的库的作者可能想要调用他们的类的名称发生冲突的机会。例如,您可以拥有多个名为“user”的类,如果他们'重新在单独的命名空间中。
考虑您编写自己的课程,我们称之为Foo
。其他人也编写了项目的一部分,他也调用了他的一个类Foo
。
命名空间解决了这个问题。
例子:
Namespace MyClasses;
Class Foo
{
}
NameSpace HisClasses;
Class Foo
{
}
$myfoo = new MyClasses\Foo();
$hisfoo = new HisClasses\Foo();