<?php
/*
命名空间解决了函数的全局命名冲突问题
如果代码使用了命名空间,那么所有代码必须写到命名空间中
*/
namespace a
{
  function hello()
  {
    return '命名空间是'.__NAMESPACE__.'<br>函数名称是:'.__FUNCTION__;
  }
}
namespace b
{
  function hello()
  {
    // return \a\hello(); //不同空间之间的函数调用,需要写完整的命名空间名称
    return '命名空间是'.__NAMESPACE__.'<br>函数名称是:'.__FUNCTION__;
  }
}
namespace
{
  // echo \a\hello();
  echo a\hello();  //调用a空间中的函数hello
  echo '<hr>';
  echo \b\hello(); //调用b空间中的函数hello
}
----------------------------------------------------------------------------------------------------
<?php
//命名空间解决了类的全局命名冲突问题
namespace a
{
  class A
  {
    public $name = '朱老师';
    public function say()
    {
      $namespace = '命名空间:'.__NAMESPACE__;
      $className = '类名:'.__CLASS__;
      $methodName = '方法名:'.__METHOD__;
      return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.$this->name;
    }
  }
}
namespace b
{
  class A
  {
    public $name = 'peter zhu';
    public function say()
    {
      $namespace = '命名空间:'.__NAMESPACE__;
      $className = '类名:'.__CLASS__;
      $methodName = '方法名:'.__METHOD__;
      $temp = (new \a\A)->name; //不同空间之间的类的访问
      return $namespace.'<br>'.$className.'<br>'.$methodName.'<br>'.  $temp;
    }
  }
}
namespace   //全局空间,默认为用反斜线表示 \
{
  echo (new a\A)->say();
  echo '<hr>';
  echo (new b\A)->say();
}
----------------------------------------------------------------------------------------------------
<?php
namespace a
{
  // const SITE_NAME = 'PHP中文网';
  define('SITE_NAME', 'PHP中文网');  //define创建的常量,不受命名空间限制
}
namespace b
{
  const SITE_NAME = 'www.php.cn';
}
namespace
{
  // echo a\SITE_NAME;
  echo SITE_NAME;
  echo '<hr>';
  echo b\SITE_NAME;
}
----------------------------------------------------------------------------------------------------
<?php
namespace a
{
  $title = '<span style="color:red">PHP中文网</span>';
  echo '当前空间的变量:'.$title;  //本空间访问
  echo '<hr>';
  const CITY = '合肥';
}
namespace b
{
  // echo '访问另一个空间中的变量'.\a\$title;
  echo '访问另一个空间中的变量'.$title;
}
namespace
{
  echo '<hr>';
  echo '全局空间中访问另一空间中的变量'.$title;
  echo '<hr>';
  echo a\CITY;
}
----------------------------------------------------------------------------------------------------
<?php
/*
将命名空间进行分级管理,可以使不同空间的代码之间的逻辑关系更加的清晰
将有一定层级关系的命名空间的标识符之间用反斜线进行分隔 \
*/
namespace father
{
  const SITE_NAME = 'PHP中文网';
}
namespace father\sub
{
  const DOMAIN = 'www.php.cn';
}
namespace
{
  echo father\SITE_NAME.'的域名是:'.father\sub\DOMAIN;
}
----------------------------------------------------------------------------------------------------
<?php
/*
命名空间的导入,本质上就是用一个别名,来简化一个比较长的多级空间名称
导入主要针对类,php5.6以后,也支持常量和函数的导入
导入空间默认名称主要用use, 空间别名的简化用as
*/
namespace app\index\controller;
const CITY = '合肥';
function say()
{
  return '大湖名城,创建高地';
}
class User
{
  public function hello()
  {
    return 'PHP是一门快速开发Web应用的脚本语言';
  }
}
namespace my;
//不用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>';
----------------------------------------------------------------------------------------------------
<?php
namespace demo;
$name = 'peter zhu';
$obj = new \stdClass;
function strtoupper($str) //可以创建与全局重名的函数
{
  return \strtoupper($str);  //访问全局系统函数必须加全局空间标识\
}
echo strtoupper($name);
----------------------------------------------------------------------------------------------------
<?php
namespace app\admin;
const SITE_NAME = 'PHP中文网';
function getDomain()
{
  return 'www.php.cn';
}
class Demo
{
  public static function hello()
  {
    return '祝贺党的十九大胜利召开';
  }
}
//1.非限定名称:省略空间名称,使用默认或当前的命名空间
echo SITE_NAME.'<br>';
echo getDomain().'<br>';
echo Demo::hello().'<hr>';
//2.限定名称:前面必须添加命名空间才可以访问, 通常用于子空间
namespace app\admin\user;
const SITE_NAME = '厉害了,我的国';
function getDomain()
{
  return '支持中央大力反腐';
}
class Demo
{
  public static function hello()
  {
    return '不忘初心';
  }
}
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>';