PHP命名空间入门

第1章 命名空间针对的主要对象

1-1 函数的命名空间

<?php
/**
 * 命名空间解决了函数的全局命名冲突问题
 * 如果代码使用了命名空间,那么所有代码必须写到命名空间中
 *
 * 同一空间不允许有两个同名的函数
 */

namespace a
{
    function hello()
    {
        /**
         * 常量__NAMESPACE__:当前空间名称
         * 常量__FUNCTION__:当前函数名称
         */
        return '命名空间是:'.__NAMESPACE__.',函数名称是:'.__FUNCTION__;
    }
}

namespace b
{
    function hello()
    {
        //return '命名空间是:'.__NAMESPACE__.',函数名称是:'.__FUNCTION__;
        return \a\hello(); // 不同空间之间的函数调用,需要写完整的命名空间名称
    }
}

// 全局命名空间名称默认为\,可以省略
namespace
{

    /**
     * 全局空间中调用独立的空间中的函数
     * 不同空间之间的相互调用,需要使用完整空间名称
     */
    //echo \a\hello();
    // 调用a空间中的函数hello
    echo a\hello();
    echo '<hr>';
    // 调用b空间中的函数hello
    echo b\hello();
}

执行效果:
在这里插入图片描述

1-2 类的命名空间

<?php
// 命名空间解决了类的全局命名冲突问题

/**
 * 同意脚本不允许重复声明两个同名的类
 */
namespace a
{
    class A
    {
        public $name = "Tom";
        public function say()
        {
            $namespace = '命名空间:'.__NAMESPACE__;
            $className = '类名:'.__CLASS__;
            $methodName = '方法名:'.__METHOD__;
            return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
        }
    }
}

namespace b
{
    class A
    {
        public $name = "Jackson";
        public function say()
        {
            $namespace = '命名空间:'.__NAMESPACE__;
            $className = '类名:'.__CLASS__;
            $methodName = '方法名:'.__METHOD__;
            // 不同空间之间的数据访问必须使用完整空间名称
            $temp = (new \a\A())->name; // 不同空间之间的类的访问
            //return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
            return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$temp;
        }
    }
}

namespace // 全局空间,默认用反斜线\表示
{
    echo (new a\A())->say();
    echo '<hr>';
    echo (new b\A())->say();
}

执行效果:
在这里插入图片描述

1-3 常量的命名空间

<?php
namespace a
{
    /**
     * const关键字声明的常量,访问时受命名空间限制
     * define函数声明的常量,不受命名空间限制
     */
    // 使用const声明
    //const SITE_NAME = 'www.csdn.net';
    // 使用define函数
    define('SITE_NAME', 'www.csdn.net');
}

namespace b
{
    const SITE_NAME = 'www.php.cn';
}

namespace
{
    //echo a\SITE_NAME;
    /**
     * 使用define函数创建的常量,没有命名空间的概念,默认就是全局的
     */
    echo SITE_NAME;
    echo '<hr>';
    echo b\SITE_NAME;
}

执行效果:
在这里插入图片描述

第2章 命名空间的分级管理

2-1 命名空间中的普通变量

<?php
/**
 * 变量本身是一个容器,命名空间对它来说没什么意义
 */

/**
 * 普通变量的访问不受命名空间限制
 * 常量、类、函数必须使用命名空间访问(即受命名空间限制)
 */
namespace a
{
    $title = '<span style="color:red;">PHP中文网</span>';
    echo '当前空间的变量:'.$title.'<hr>'; // 本空间访问
    const CITY = '北京';
}
namespace b
{
    //echo '访问另一个空间中的变量'.\a\$title; // syntax error, unexpected '$title' (T_VARIABLE), expecting identifier (T_STRING)
    // 变量名称前不允许带空间名称
    echo '访问另一个空间中的变量'.$title.'<hr>';
}

namespace
{
    echo '全局空间中访问另一空间中的变量'.$title;
    echo '<hr>';
    // 常量、类、函数必须使用命名空间访问
    echo a\CITY;
}

执行效果:
在这里插入图片描述

2-2 命名空间的分层机制

<?php

/**
 * 将命名空间进行分级管理,可以使不同空间的代码之间的逻辑关系更加的清晰
 * 将有一定层级关系的命名空间的标识符之间用反斜线进行分隔 \
 *
 * 类空间的分级机制,是类文件自动加载的实现基础
 */

namespace father
{
    const SITE_NAME = '百度';
}

namespace father\sub
{
    const DOMAIN = 'www.baidu.com';
}

namespace
{
    echo \father\SITE_NAME.'的域名是:'.\father\sub\DOMAIN;
}
百度的域名是:www.baidu.com

第3章 命名空间的引入与简化

3-1 命名空间的导入与简化

<?php

/**
 * 命名空间的导入,本质上就是用一个别名,来简化一个比较长的多级的命名空间名称
 *
 * 导入主要针对类空间,PHP5.6以后,也支持常量与函数空间名称导入
 *
 * 导入空间默认名称主要用use,空间别名的简化用as
 * 使用use导入空间别名,可用as来自定义别名,防止空间重名
 */

namespace app\index\controller;
const CITY = '北京';

function say()
{
    return 'Hello world!';
}

class User
{
    public function hello()
    {
        return "I'm fine, thank you!";
    }
}

namespace myspace;

// 不使用use来简化空间名称

echo \app\index\controller\CITY.'<br>';
echo \app\index\controller\say().'<br>';
$user = new \app\index\controller\User;
echo $user->hello();
echo '<hr>';

// 用use来导入一个命名空间,并起个简短的名称
use const app\index\controller\CITY;
use function app\index\controller\say;
use app\index\controller\User;
echo CITY.'<br>';
echo say().'<br>';
$user = new User;
echo $user->hello();
echo '<hr>';

// 用as来进一步简化空间的名称
use const app\index\controller\CITY as C;
use function app\index\controller\say as s;
use app\index\controller\User as U;
echo C.'<br>';
echo s().'<br>';
$user = new U;
echo $user->hello();
echo '<hr>';

执行效果:
在这里插入图片描述

3-2 全局/公共命名空间

<?php
namespace demo;
$name = 'lisi';
/**
 * stdClass是系统定义在全局中的一个标准类
 * 访问全局中的标准类或函数,需要在前面加反斜线\
 */
$obj = new \stdClass();

// 不同的空间下,自定义函数与系统函数可以重名
function strtoupper($str)
{
    // 访问全局系统函数必须加全局空间标识\
   return \strtoupper($str);
}

echo strtoupper($name); // 这里调用的是当前demo空间下的strtoupper函数
LISI

3-3 命名空间的三种引入方式

<?php
/**
 * 命名空间的三种引用方式:
 * 1.非限定名称
 * 2.限定名称
 * 3.完全限定名称
 */

namespace app\admin;
const SITE_NAME = 'PHP中文网';
function getDomain()
{
    return 'www.php.cn';
}

class Demo
{
    public static function hello()
    {
        return 'Hello world';
    }
}


// 1.非限定名称:省略空间名称,使用默认或当前的命名空间
echo SITE_NAME.'<br>';
echo getDomain().'<br>';
echo Demo::hello().'<hr>';

// 2.限定名称:前面必须添加命名空间才可以访问,通常用于子空间
namespace app\admin\user;
const SITE_NAME = '百度';
function getDomain()
{
    return 'www.baidu.com';
}

class Demo
{
    public static function hello()
    {
        return 'Never say never';
    }
}

namespace app\admin;
echo user\SITE_NAME.'<br>';
echo user\getDomain().'<br>';
echo user\Demo::hello().'<hr>';


// 3.完全限定名称:从全局空间的反斜线开始\
echo \app\admin\SITE_NAME.'<br>';
echo \app\admin\getDomain().'<br>';
echo \app\admin\Demo::hello().'<hr>';

echo \app\admin\user\SITE_NAME.'<br>';
echo \app\admin\user\getDomain().'<br>';
echo \app\admin\user\Demo::hello().'<hr>';

执行效果:
在这里插入图片描述

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页