【发布时间】:2010-10-10 06:23:59
【问题描述】:
我听说最新的 PHP 支持命名空间。我知道在全局范围内定义的变量有 no 命名空间,那么如何在不同的命名空间中创建变量呢?
它只是对变量/函数进行分类的一种方式吗?
【问题讨论】:
标签: php namespaces
我听说最新的 PHP 支持命名空间。我知道在全局范围内定义的变量有 no 命名空间,那么如何在不同的命名空间中创建变量呢?
它只是对变量/函数进行分类的一种方式吗?
【问题讨论】:
标签: php namespaces
命名空间通常与库一起使用,使用 1 个单独的命名空间引用库代码的能力有助于不破坏已经在使用的其他库代码。
【讨论】:
namespace 允许您组织代码并为您提供封装项目的方法。
您可以将命名空间可视化为文件系统使用目录对相关文件进行分组。
基本上,命名空间为您提供了一种对相关类、函数和常量进行分组的方法。
它们还有助于避免 PHP 类/函数/常量之间的名称冲突,并提高代码可读性,避免过长的类名。
命名空间声明示例:
<?php
namespace MyProject;
const CONNECT_OK = 1;
class Connection { /* ... */ }
function connect() { /* ... */ }
?>
【讨论】:
命名空间解决了从库中导入类和函数时的命名冲突问题。
如果没有命名空间,如果您包含两个库,而这两个库恰好定义了同名的函数/类(即,两个库都包含一个名为“用户”的类),它将失败。
由于 PHP 中不支持命名空间,大多数库已采取在其函数/类名称前加上可能是唯一的前缀,以避免名称冲突。问题是,这会创建更长的函数或类名。
here 给出的示例属于异常类:
PEAR_Form_Loader_Validate_Table_Element_Validator_Exception.
您可以使用“AS”关键字(您选择的名称)将长名称空间作为别名导入您自己的本地范围。因此,您仍然可以在本地范围内选择一个简短的类名。
下面将一个名为 DbConnection 的“别名”应用到 Zend::DB::Connection。
use Zend::DB::Connection as DbConnection
【讨论】:
命名空间是一种用于组织变量、函数和类的编程语言机制。 PHP 5.3 增加了对命名空间的支持,我将在下面的示例中进行演示:
假设您想合并两个项目,它们使用相同的类名 User,但每个项目都有不同的实现:
// Code for Project One (proj1.php)
<?php
class User {
protected $userId;
public function getUserId() {
return $this->userId;
}
}
$user = new User;
echo $user->getUserId();
?>
// Code for Project Two (proj2.php)
<?php
class User {
public $user_id;
}
$user = new User;
echo $user->user_id;
?>
<?php
// Combine the two projects
require 'proj1.php';
require 'proj2.php'; // Naming collision!
$myUser = new User; // Which class to use?
?>
对于低于 5.3 的 PHP 版本,您将不得不为其中一个项目使用的 User 类的所有实例更改类名,以防止命名冲突:
<?php
class ProjectOne_User {
// ...
}
$user = new ProjectOne_User; // Code in Project One has to be changed too
?>
对于大于或等于 5.3 的 PHP 版本,您可以在创建项目时使用命名空间,方法是添加命名空间声明:
<?php
// Code for Project One (proj1.php)
namespace ProjectOne;
class User {
// ...
}
$user = new User;
?>
<?php
// Combine the two projects
require 'proj1.php';
use ProjectOne as One; // Declare namespace to use
require 'proj2.php' // No collision!
$user = new \One\User; // State which version of User class to use (using fully qualified namespace)
echo $user->user_id; // Use ProjectOne implementation
?>
更多信息:
【讨论】: