定义:命名空间是一种封装事物的方法
为何要用命名空间
1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
命名空间语法
<?php
namespace App;
class Test{
}
?>
一个页面可以定义多个命名空间,但并不建议这么做
<?php
//定义子命名空间
namespace App\Http;
class Response {
public function index() {
}
}
namespace App\Http\Controllers;
class Request() {
}
?>
注:在页面的开头,第一个namespace声明前面,不能加任何代码,除了delare语法
大括号写法:
<?php
namespace App {
class Test{
public function index() {
}
}
}
namespace App\Http {
class Test{
public function index() {
}
}
}
//这里没加命名空间名称,表示全局命名空间
namespace {
$num = 10;
for($i = 0;$i<$num;$i++) {
echo $i;
}
}
使用命名空间:
1.php
<?php
namespace App\Http;
class Response {
public static function test($str=null) {
$array = array(
sprintf('访问方式:[%s]',$str),
sprintf('File:[%s]',basename(__FILE__)),
sprintf('命名空间:[%s]',__NAMESPACE__),
sprintf('类名:[%s]',__CLASS__),
sprintf('方法名:[%s]',__METHOD__),
);
echo implode('---',$array),PHP_EOL;
}
}
?>
2.php
<?php
namespace App\Lib\Http;
class Response {
public static function test($str=null) {
$array = array(
sprintf('访问方式:[%s]',$str),
sprintf('File:[%s]',basename(__FILE__)),
sprintf('命名空间:[%s]',__NAMESPACE__),
sprintf('类名:[%s]',__CLASS__),
sprintf('方法名:[%s]',__METHOD__),
);
echo implode('---',$array),PHP_EOL;
}
}
?>
test.php
<?php
//包含文件
require '1.php';
require '2.php';
//直接使用命名空间调用方法
App\Http\Response::test('命名空间');
App\Lib\Http\Response::test('命名空间');
//输出
//访问方式:[命名空间]---File:[1.php]---命名空间:[App\Http]---类名:[App\Http\Response]---方法名:[App\Http\Response::test]
//访问方式:[命名空间]---File:[2.php]---命名空间:[App\Lib\Http]---类名:[App\Lib\Http\Response]---方法名:[App\Lib\Http\Response::test]
//使用use方式访问
//use的用处是将类导入进来,然后直接使用类名,就不用写那么长的命名空间了
use App\Http\Response;
//访问方法
Response::test('use');
//输出
//访问方式:[use]---File:[1.php]---命名空间:[App\Http]---类名:[App\Http\Response]---方法名:[App\Http\Response::test]
//use App\Lib\Http\Response;//如果这里也这么写的话,就报错了,提示类名重复定义了,所以这里要做个别名
use App\Lib\Http\Response as LibResponse;//这样才行
//访问方法
LibResponse::test('use');
//输出
//访问方式:[use]---File:[2.php]---命名空间:[App\Lib\Http]---类名:[App\Lib\Http\Response]---方法名:[App\Lib\Http\Response::test]
//注:use和require并不是一个意思,use是基于require文件之后,导入一个类名而已,这俩不能混淆
//使用系统全局方法,加上一个反斜杠即可
echo \strlen('123');
throw new \Exception('oh no!');
?>
为何要用命名空间
1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
命名空间语法
<?php
namespace App;
class Test{
}
?>
一个页面可以定义多个命名空间,但并不建议这么做
<?php
//定义子命名空间
namespace App\Http;
class Response {
public function index() {
}
}
namespace App\Http\Controllers;
class Request() {
}
?>
注:在页面的开头,第一个namespace声明前面,不能加任何代码,除了delare语法
大括号写法:
<?php
namespace App {
class Test{
public function index() {
}
}
}
namespace App\Http {
class Test{
public function index() {
}
}
}
//这里没加命名空间名称,表示全局命名空间
namespace {
$num = 10;
for($i = 0;$i<$num;$i++) {
echo $i;
}
}
使用命名空间:
1.php
<?php
namespace App\Http;
class Response {
public static function test($str=null) {
$array = array(
sprintf('访问方式:[%s]',$str),
sprintf('File:[%s]',basename(__FILE__)),
sprintf('命名空间:[%s]',__NAMESPACE__),
sprintf('类名:[%s]',__CLASS__),
sprintf('方法名:[%s]',__METHOD__),
);
echo implode('---',$array),PHP_EOL;
}
}
?>
2.php
<?php
namespace App\Lib\Http;
class Response {
public static function test($str=null) {
$array = array(
sprintf('访问方式:[%s]',$str),
sprintf('File:[%s]',basename(__FILE__)),
sprintf('命名空间:[%s]',__NAMESPACE__),
sprintf('类名:[%s]',__CLASS__),
sprintf('方法名:[%s]',__METHOD__),
);
echo implode('---',$array),PHP_EOL;
}
}
?>
test.php
<?php
//包含文件
require '1.php';
require '2.php';
//直接使用命名空间调用方法
App\Http\Response::test('命名空间');
App\Lib\Http\Response::test('命名空间');
//输出
//访问方式:[命名空间]---File:[1.php]---命名空间:[App\Http]---类名:[App\Http\Response]---方法名:[App\Http\Response::test]
//访问方式:[命名空间]---File:[2.php]---命名空间:[App\Lib\Http]---类名:[App\Lib\Http\Response]---方法名:[App\Lib\Http\Response::test]
//使用use方式访问
//use的用处是将类导入进来,然后直接使用类名,就不用写那么长的命名空间了
use App\Http\Response;
//访问方法
Response::test('use');
//输出
//访问方式:[use]---File:[1.php]---命名空间:[App\Http]---类名:[App\Http\Response]---方法名:[App\Http\Response::test]
//use App\Lib\Http\Response;//如果这里也这么写的话,就报错了,提示类名重复定义了,所以这里要做个别名
use App\Lib\Http\Response as LibResponse;//这样才行
//访问方法
LibResponse::test('use');
//输出
//访问方式:[use]---File:[2.php]---命名空间:[App\Lib\Http]---类名:[App\Lib\Http\Response]---方法名:[App\Lib\Http\Response::test]
//注:use和require并不是一个意思,use是基于require文件之后,导入一个类名而已,这俩不能混淆
//使用系统全局方法,加上一个反斜杠即可
echo \strlen('123');
throw new \Exception('oh no!');
?>