所谓的命名空间便是为理解决函数、常量(const定义的常量)以及类的命名冲突问题。
2、利用命名空间办理命名冲突问题
基本语法:
namespace(关键词) + 空间名称(虚拟的, 与真实路径没有任何关系, 可以任意定义)
<?php//定义命名空间namespace First;//定义一个类class Controller{}//定义命名空间namespace Second;//定义一个类class Controller{}?>
3、子命名空间
命名空间是虚拟的, 其定义办法也可以与路径相似, 采取多级构造。
<?php//定义命名空间namespace Admin\First;//定义一个类class Controller{}//定义命名空间namespace Home\Second;//定义一个类class Controller{}
4、命名空间把稳事变
在实际项目开拓中, 第一个命名空间前面不能涌现任何其他代码! 服膺!!!
<?phpheader("Content-type:text/html; charset=utf-8");namespace Admin\First;?>Fatal error: Namespace declaration statement has to be the very first statement in the script in E:\wamp\apache\htdocs\20160624\namespace.php on line 3
5、命名空间的访问
第一种办法:非限定名称访问办法
<?phpnamespace Admin\First;class Controller{ public function __construct(){ echo 'first'; }}namespace Home\Second;class Controller{ public function __construct(){ echo 'Second'; }}$construct = new Controller(); //Second?>
遵照的原则:就近原则
第二种办法:限定名称访问办法(须要利用use引入命名空间)
<?phpnamespace Admin\First;class Controller{ public function __construct(){ echo 'first'; }}namespace Home\Second;class Controller{ public function __construct(){ echo 'Second'; }}// 利用use引入命名空间use Admin\First;$construct = new Controller(); //Second 引入空间不会改变访问空间,还是访问当前空间echo "<hr>";$construct = new First\Controller(); //First?>
特殊解释:默认情形下, 利用use方法引入命名空间并不会改变空间路径, 访问的还是就近的命名空间。如何办理以上问题呢?
答:利用限定名称访问办法
$工具 = new 命名空间\类名称的形式
use 也可以引入命名空间+类名
<?phpnamespace Admin\First;class Controller{ public function __construct(){ echo 'first'; }}namespace Home\Second;class Controller{ public function __construct(){ echo 'Second'; }}// 利用use引入命名空间use Admin\First\Controller;$construct = new Controller(); //Second 引入空间+类还是不会改变访问空间,还是访问当前空间?>
第三种办法:完备限定名称访问命名空间
<?phpnamespace Admin\First;class Controller{ public function __construct(){ echo 'first'; }}namespace Home\Second;class Controller{ public function __construct(){ echo 'Second'; }}$construct = new \Admin\First\Controller(); //First?>
把稳:完备限定访问办法必须以"\"办法访问;
6、利用use导入空间类(ThinkPHP框架导入办法)
基本语法:
use 命名空间\类名称;
<?phpnamespace Admin\Controller;use Think\Controller;?>
分外情形解释:如果导入的类名称与当前命名空间下的类名称同等, 就会涌现名称冲突问题, 这可以利用别名的办法办理:
示例代码:
<?phpnamespace Admin\First;class Controller{ public function __construct(){ echo 'first'; }}namespace Home\Second;class Controller{ public function __construct(){ echo 'Second'; }}// 利用use引入命名空间use Admin\First\Controller as FirstController;$construct = new Controller(); //Second 引入空间+类还是不会改变访问空间,还是访问当前空间$construct = new FirstController(); //First?>
7、公共命名空间
当我们在一个命名空间下引入一个没有定义命名空间的函数、常量以及类, 我们把这种情形就称之为公用命名空间。
公共命名空间下的元素访问必须利用完备限定办法。
$std = new \stdClass();
8、const和define的差异:
前者针对命名空间发生影响, 后者不发生影响。
const可以声明多个同名称的常量
define对同名称常量只能声明一个
掌握器:
//1、定义命名空间namespace Admin\Controller;//2、引入核心掌握器use Think\Controller;//3引入核心模型, 必须利用此种方法use Think\Model;//4 引入自定义模型use DeptModel;//4、定义自定义掌握器class PublicController extends Controller { //5 定义login方法 public function login() { //通过display方法显示输出模板内容 $this->display(); }}
Admin: 模块
Controller: 掌握器
Admin\Controller: 代表Admin模块下的掌握器
Think\Controller: 代表Think核心的掌握器
模型:
<?php//1、定义命名空间namespace Admin\Model;//2、引入核心模型use Think\Model;//3、定义Dept模型class DeptModel extends Model {}
Admin: 模块
Model: 模型
Admin\Model: 代表Admin模块下的模型
Think\Model: 代表Think核心的模型
命名空间下加载文件和实例化类方法
require_once("./plugins/payment/wxpay/Api.php"); //避免重复加载$input= new \WxPayUnifiedOrder();
把稳: 在命令空间外利用define()定义的常量是无法利用的, 应该利用const定义常量;
class_exists()和method_exists()利用
bool class_exists ( string $class_name [, bool $autoload = true ] )
检讨指定的类是否已定义。
class_name 类名。名字的匹配是不分区大小写的。
autoload 是否默认调用 __autoload。
bool method_exists ( mixed $object , string $method_name )
检讨类的方法是否存在于指定的 object中。
object 工具示例或者类名。
method_name 方法名。
<?phpnamespace Admin\First;class Controller{ public function __construct(){ echo 'first'; } public function say(){ echo "这是一个说话的方法"; }}namespace Home\Second;class Controller{ public function __construct(){ echo 'Second'; } public function say(){ echo "这是一个说话的方法"; }}if(class_exists("Admin\First\Controller")){echo "Controller类存在<br/>";$obj = new \Admin\First\Controller();if(method_exists($obj, "say")){ echo "say方法存在";}}else{ echo "Controller不存在";}echo "<br/>";echo Controller::class; //Home\Second\Controller 返回 完成 的class类名 PHP5.5新增?>
PHP 类名::class含义
自 PHP 5.5 起, 关键词 class 也可用于类名的解析。
利用 ClassName::class 可以获取一个字符串, 包含了类 ClassName 的完备限定名称。这对利用了命名空间的类尤其有用。
<?phpnamespace ddd\vector;class Demo{ public function test() { // code... }}echo Demo::class; //ddd\vector\Demo?>